BaseModel.php 2.18 KB
<?php

namespace App\Models;

use DateTimeInterface;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

/**
 * Class BaseModel
 * @package App\Models
 */
class BaseModel extends Model
{
    use HasFactory;

    public function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }

    /**
     * @return string
     */
    public static function table()
    {
        return (new static())->getTable();
    }

    /**
     * @param Builder $builder
     * @param array $params
     * @return Builder
     */
    public function scopeCustom(Builder $builder, array $params)
    {
        foreach ($params as $key => $value) {
            $builder = $builder->when(filled($params[$key]), function ($query) use ($key, $value){
                $query->where($key, $value);
            });
        }
        return $builder;
    }

    /**
     * @param Builder $builder
     * @param array $params
     * @return Builder|\Illuminate\Support\Traits\Conditionable|mixed
     */
    public function scopeLike(Builder $builder, array $params)
    {
        foreach ($params as $key => $value) {
            $builder = $builder->when(filled($params[$key]), function ($query) use ($key, $value){
                $query->where($key, 'like', "%{$value}%");
            });
        }
        return $builder;
    }

    /**
     * @param Builder $builder
     * @return Builder
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function scopeIdentify(Builder $builder)
    {
        return $builder->whereIn('stakeholder_id', request()->get('stakeholder_ids'));
    }

    /**
     * 排序
     * @param $sort
     * @return mixed
     */
    public function scopeSorted(Builder $query, $sort): Builder
    {
        $table = (new static)->getTable();

        try {
            $sort = json_decode($sort, true);
            return $query->orderBy($sort['prop'] ?? "{$table}.updated_at", $sort['order'] ?? 'desc');
        } catch (\Exception $e) {
            return $query->orderBy("{$table}.updated_at", 'desc');
        }
    }

}