# 模型

Thinkphp 项目是一致的,在 Laravel 中也提供了基础的模型 CatchModel。在提供的基础操作了也基本保持了一致,所以切换过来还是比较方便的。下面是基础 Model 的代码

abstract class CatchModel extends Model
{
    use BaseOperate, Trans, SoftDeletes;

    /**
     * unix timestamp
     *
     * @var string
     */
    protected $dateFormat = 'U';

    /**
     * paginate limit
     */
    protected $perPage = 10;

    /**
     * enable status
     */
    public const ENABLE = 1;

    /**
     * disable status
     */
    public const DISABLE = 2;

    /**
     * @var string[]
     */
    protected $hidden = ['deleted_at'];

    /**
     * @var string[]
     */
    protected $casts = [
        'created_at' => 'timestamp',

        'updated_at' => 'timestamp',

        'deleted_at' => 'timestamp'
    ];
}
  • 列表不会返回 deleted_at 字段
  • 对于 created_at, updated_at, deleted_at 全部使用的 int 类型时间戳
  • 提供常量 DisableEnable 表示开启关闭,当然也可以使用这两个常量表示其他的正反状态
  • perPage 分页每页固定的显示的数量
  • CatchModel 还是默认使用软删除

# BaseOperate

# storeBy(array $data)

用于单个数据进行保存,不要在循环中使用该方法。⚠️注意 storeBy 是配合模型中的 fillable 字段使用,不再 fillable 中的字段将不会被填充。

$model->storeBy($request->all())

# createBy(array $data)

用于单个数据进行保存,支持循环中使用该方法。。⚠️注意 storeBy 是配合模型中的 fillable 字段使用,不再 fillable 中的字段将不会被填充

foreach($data as $item) {
    $model->createBy($item);
}

# updateBy($id, array $data): bool

表示更新数据。⚠️注意 storeBy 是配合模型中的 fillable 字段使用,不再 fillable 中的字段将不会被填充

$model->updateBy($id, $data);

# firstBy($id, array $columns = ['*'])

$model->firstBy($id);

这里为了配合 thinkphp 的方法。其实在 Laravel 项目中,个人建议是这么写。

$model->where($model->getKeyName(), $id)->firstOr(function(){
    throw new \Exception('nothing');
})

OR

$model->find($id);

# deleteBy($id, bool $force = false)

删除默认软删除,如果需要物理删除,$force = true;

$model->deleteBy($id);

# disOrEnable($id, string $field = 'status'): bool

对于数据表内的正/反状态的字段,可以使用该发放

$model->disOrEnable($id, 'clost');

# quickSearch()

快速搜索。提供了一个是和约定的字段,来配合搜索

  • field:like 模糊查询字段
  • field:startLike 模糊查询字段 %field
  • field:endLike 模糊查询字段 field%
  • field:gt 大于字段
  • field:lt 小于
  • field:ge 大于等于
  • field:le 小于等于
  • field:in 集合查询,字段值约定以,分割

# tree($id, $parentId, ...$fields)

这样可以直接使用 tree 方法获取树形结构, 例如 Roles

Roles::query()->tree('id', 'parent_id', 'role_name');

# 软删除

Laravel 提供的默认的软删除,也就是 deleted_at 字段默认值是 null, 这也就表示对于查询最后都会加上

select * from users where deleted_at = null

为了兼容 thinkphp 的查询,所以在这里修改默认查询, 变成下面这样

select * from users where deleted_at = 0

Laravel 通过设置全局查询来改变其软删除的条件,thinkphp 则是通过配置模型属性。如果继承了 CatchModel, 那么软删除的条件会自动变成deleted_at = 0

# Query 记录

CatchAdmin 提供了很方便的 SQL 日志记录方法。只需要在 AppServiceProvider 配置如下代码。

Query::listen($latest=true)

如果最新的 SQL 将会按照时间倒叙记录,如果设置 false,那么将会按照时间正序记录。默认倒叙记录。CatchAdminSQL 以一次请求为基础,以会车作为分割。