Skip to content

模型介绍

一般后台项目大多数业务处理都是跟模型相关的,所以在模型上做的处理还是比较多的。目前catchadmin的模型都是继承 CatchAModel,所以先来看看CatchModel

INFO

model 一定要慢慢看完,开发加倍效果

CatchModel

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

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

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

    /**
     * @var string[]
     */
    protected array $defaultCasts = [
        'created_at' => 'datetime:Y-m-d H:i:s',

        'updated_at' => 'datetime:Y-m-d H:i:s',
    ];

    protected array $defaultHidden = ['deleted_at'];

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        $this->init();
    }

    /**
     * init
     */
    protected function init()
    {
        $this->makeHidden($this->defaultHidden);

        $this->mergeCasts($this->defaultCasts);
    }


    // 修改软删除的查询条件
    public static function bootSoftDeletes(): void
    {
        static::addGlobalScope(new SoftDelete());
    }
}

CatchAdmin 的所有表的 created_atupdated_at 都是 timestamp,也就是 int 类型,所以在返回给客户端的时候,需要转成 date,所以单独设置了 defaultCasts

php
protected array $defaultCasts = [
    'created_at' => 'datetime:Y-m-d H:i:s',

    'updated_at' => 'datetime:Y-m-d H:i:s',
];

这里有人肯定会有疑问?为什么要非要加一个 defaultCasts 属性呢?为什么不直接用 casts

TIP

因为所有模型都是继承CatchAdmin, 并且这个日期转换基本每个模型都会用得到。所以一旦这里如果设置成 casts, 有可能会被用户自定义的 casts 覆盖。还有一个 defualtHidden属性是一个道理

软删除

由于CatchAdmin 软删除默认值是0,所以软删除的查询条件也必须改变。在 CatchModel 引入 SoftDeleteScope,当然使用还是和原本是一样的,无需改动

php
class SoftDelete extends SoftDeletingScope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where($model->getQualifiedDeletedAtColumn(), '=', 0);
    }
}

取消软删

某些情况下,可能不需要软删除的需求,例如一些 log 记录。但是还是想使用 admin 自带的一些模型操作方法,那么可以这么使用。你可以继承 Laravel 自带的 EloquentModel, 但是需要使用三个 trait 来满足基本操作功能,下面的例子来自项目中的操作日志

php
namespace Modules\User\Models;

use Catch\CatchAdmin;
// 添加以下三个 trait 操作
use Catch\Traits\DB\BaseOperate; // 基本操作
use Catch\Traits\DB\ScopeTrait; // scope trait
use Catch\Traits\DB\Trans; // 事务操作
use Illuminate\Database\Eloquent\Model;

class LogOperate extends Model
{
    use BaseOperate, Trans, ScopeTrait;
}

属性

除了上面的改变,CatchAdmin 还新增了若干属性,以增强项目的粘合性。

php

    // 当需要树状结构的表,父级设置 'parent_id', 建议就使用默认的
    // 因为后台提供的 Tree 结构都是使用该字段
    protected string $parentIdColumn = 'parent_id';

    // 排序字段,默认使用 sort
    protected string $sortField = 'sort';

    // 排序规则
    protected bool $sortDesc = true;

    // 列表的数据返回是否以树状结构返回
    protected bool $asTree = false;

    // 列表查询的默认字段
    protected array $fields = [];

    // 列表是否是分页
    // 默认分页
    protected bool $isPaginate = true;

    // 创建和更新数据提交的字段
    // form 字段
    protected array $form = [];

    // 提交的数据是否有关联关系
    // 例如用户(user) 和 角色 (roles)
    // user 跟角色是一对多的关系
    // 那么 user 模型里面就设置角色关系的方法
    // formRelations 就是使用该方法名称
    protected array $formRelations = [];

模型方法

列表

php
public function getList(): miexed

支持自定义查询

因为现在列表的查询是针对单表的,既没有 join 也没有 with 等关联查询,如果需要自己进行一些自定义的查询,可以使用查询钩子

php
// 例如这里需要对 sort 字段排序
$model->setBeforeGetList(function ($query) {
    return $query->orderByDesc('sort');
})->getList();
php
// 例如这里需要 join 某个表
$model->setBeforeGetList(function ($query) {
    return $query->join('some_table'....)
})->getList();
php
// 例如这里加一层关联关系
$model->setBeforeGetList(function ($query) {
    return $query->with('some_relations')
})->getList();

保存数据

php
public function storeBy(array $data): bool`

保存数据(支持循环插入)

php
public function createBy(array $data): mixed

INFO

该方法可用于循环插入数据,storeBy 则不行

更新数据

php
public function updateBy($id, array $data): mixed

查询数据

php
public function firstBy($value, $field = null, array $columns = ['*']): ?Model

默认使用 id 字段查询

删除数据

php
public function deleteBy($id, bool $force = false): ?bool

默认使用 id 字段的 value 删除,force 参数则进行物理删除

状态切换

php
public function toggleBy($id, string $field = 'status'): bool

通过 ID 进行状态切换,默认是 status 字段

处理树状数据的下级数据

php
public function updateChildren(mixed $parentId, string $field, mixed $value): void

字段别名

php
public function aliasField(string|array $fields): string|array

设置 ceator_id

php
public function setCreatorId()

自动写入创建人 ID

CatchAdmin 默认追自动填充创建人字段,如何你想取消,可以使用

php
$model->fillCreatorId(false)->storeBy($data);

获取创建人

php
public function scopeCreator();

这是 scope 查询,可以直接使用。

php
Model::select('*')->creator()->get();

当然使用该查询,数据表里面必须包含creator_id字段,即创建人字段,否则没有作用

模糊查询

php
public function whereLike($field, $value)

快速查询

php
public function quickSearch(array $params = [])

该方法是通过模型属性 searchable 搭配 Request 进行快速搜索,下面一个例子

php
protected array $searchable = [
    'status' => '=',

    'nickname' => 'like'
]

如果进行这样的设置,模型的查询就会自动动态生成这样的代码, 通过这样的设置就可以很轻松的进行搜索

php
Model::select('*')
    ->where('status', $request->get('status'))
    ->whereLike('nickname', $request->get('nickname'))
    ->get();

开启事务

之前都需要引入开启事务,例如

php
DB::beginTransaction();

现在可以直接在模型调用了

php
$this->beginTransaction();

事务的其他几个操作也是一样的,可以直接在模型中开启