# 模型介绍

在日常开发中,和我们打交道最多的就是数据库了。所以经常会使用到模型。CatchAdmin也提供非常便利的 CURD 操作。如果你想使用这些操作,必须使用CatchModel类。继承它,会让你的 CURD更加迅速稳定。

看看他是如何定义的?在此之前的呢,先看一下模型如何定义的。

class Attachments extends CatchModel
{
    protected $name = 'attachments';
    
    protected $field = [
            'id', // 
			'path', // 附件存储路径
            'url', // 资源地址
			'mime_type', // 资源mimeType
			'file_ext', // 资源后缀
			'file_size', // 资源大小
			'filename', // 资源名称
			'driver', // local,oss,qcloud,qiniu
			'created_at', // 创建时间
			'updated_at', // 更新时间
			'deleted_at', // 删除时间
    ];
}

像这样的形式的模型,都是通过命令生成的。无需你手动填写。所以 CatchAdmin 中所有的模型拥有Field 属性,它就是表字段的映射,这在之后的 CURD 中很有必要。

# CatchModel

abstract class CatchModel extends \think\Model
{
    // 除了 softDelete 其他三个 trait 都是 catchadmin 中使用的。你可以用到任何你想用的地方
    use SoftDelete, TransTrait, BaseOptionsTrait, ScopeTrait;

    // 自定义创建时间字段
    protected $createTime = 'created_at';
    // 自定义更新时间字段
    protected $updateTime = 'updated_at';
    // 自定义删除字段
    protected $deleteTime = 'deleted_at';
    // 默认删除的值
    protected $defaultSoftDelete = 0;
    // 自动写入时间戳
    protected $autoWriteTimestamp = true;

    public const LIMIT = 10;

    // 开启
    public const ENABLE = 1;
    // 禁用
    public const DISABLE = 2;
}

一目了然。他使用软删除。所以如果你不想使用软删除,可以直接继承 \think\Model。他还使用了三个trait,这三个trait就是 CURD 操作的保证。

# BaseOptionsTrait

看一下它所提供的有哪些方法,在下面会一一说明。

    // 列表查询方法
    public function getList(){}

    // 新增单条数据
    public function storeBy(array $data){}

    // 循环插入数据时使用
    public function createBy(array $data){}

    // 更新数据
    public function updateBy($id, $data, $field = ''): bool{}

    // 查找数据
    // 第一个是 id
    // 第二个是查询的字段
    // 第三个 true 可查询软删除的数据
    public function findBy($id, array $field = ['*'], $trash = false){}

    // 删除数据
    // force true 可物理删除数据
    public function deleteBy($id, $force = false){}

    // 批量插入数据
    public function insertAllBy(array $data){}

    // 软删除恢复
    public function recover($id){}
    
    // 获取删除字段
    public function getDeleteAtField(){}

    // 别名字段 自动添加当前模型的表名
    public function aliasField($field): string{}

    // 禁用/启用 如果表里面有 status 字段默认使用,当然也可以自定义字段
    public function disOrEnable($id, $field='status'){}

# TransTrait

这是关于事务操作的方法,轻松使用模型操作,丢弃 Db::startTrans, 这种不是很便利的操作。使用方法和文档是一样的,无需担心。

    // 开启事务
    public function startTrans(){}

    // 提交事务
    public function commit(){}

    // 回滚事务
    public function rollback(){}

    // 事务组的操作  
    public function transaction(\Closure $function){}

在继承CatchModel之后你可以直接在模型里面使用,eg.而且有非常友好的提示。

$this->startTrans();

# ScopeTrait

范围查询只提供了创建者查询。非常方便。

public function scopeCreator($query);

使用有很好的案例,例如

$this->catchSearch()
    ->field('*')
    ->catchOrder()
    ->creator()
    ->paginate();

WARNING

当你使用范围查询的 creator 方法时候,必须放在 field 方法之后,而且不能单独使用,必须强制使用 field 方法进行查询。

# 搜索

catchadmin 默认使用框架的搜索器,所以你只需要使用搜索器就好了,搜索的参数被CatchAdmin过滤了。具体搜索器的用法可以看框架文档

# CatchQeury

CatchQuery在框架起到了很重要的作用,它继承了框架 Query, 并且新写了很多方法,这些方法在开发中起到很大的作用。所以将这些方法运用到你的开发之中,会事半功倍。

# 重写的方法

  
  // model Join 的模型
  // oinField join 模型的字段
 // currentJoinField 当前模型的关联的字段
  // field 需要 join 的模型查询的字段
  public function catchJoin(string $model, string $joinField, string $currentJoinField, array $field = [], string $type = 'INNER', array $bind = []): CatchQuery

  // 这个方法很常用
  // 例如你表里有 10 个字段,但是偏偏有一字段你不需要,那么这个方法可以帮你过滤掉该字段 
  // !注意 是主表的字段
  public function withoutField($field, $needAlias = false)

  // 调用它 配合搜索器完美实现搜索  
  public function catchSearch($params = []): CatchQuery

  // 获取 alias 字段  
  public function getAlias()
   
  // like 查询 默认 both %%
  // option => left %xxx
  // option => right xxx% 
  public function whereLike(string $field, $condition, string $logic = 'AND', $option ='both'): Query

  // 增加额外字段 在有必要的时候可以添加  
  public function addFields($fields): CatchQuery

  // 分页
  public function paginate($listRows = null, $simple = false): Paginator

  // 排序
  // 如果你使用了它,并且存在 sort 字段 那么最后的结果就是这样的
  // order('sort')->order('id') 很方便有么有
  public function catchOrder($order = 'desc')

  // 添加子查询  
  public function  addSelectSub(callable $callable, string $as)