Skip to content

模型层

模型层使用了illuminate/database组件,依托Eloquent ORM提供的强大功能,模型层可以快速安全的和数据库进行交互

模型的定义

  • 通过protected $table定义了对应的数据表名称
  • 通过protected $primaryKey定义了主键
  • 通过use SoftDeletes;const DELETED_AT定义了软删除
  • 通过protected $orderField定义了排序字段
  • 通过protected $orderType定义来排序方式
  • 通过protected $uniqueField定义了需要检测唯一性的字段,该定义是灵活的,单独键值service会进行单独校验,组合键值service会进行组合校验,

单独校验定义

php
  protected $uniqueField = ['config_name', 'config_key'];

系统会先对config_name进行校验,然后对config_key进行校验

组合校验定义

php
  protected $uniqueField = [['config_name', 'config_key']];

系统会对config_nameconfig_key一起进行校验

搜索器的定义

php
    public function searchConfigNameAttr($query, $value, $data)
    {
        $query->where('config_name','like', '%' . $value . '%');
    }
  • 搜索器的方法应该是public
  • 搜索器的方法名应该是search+大驼峰字段名+Attr组成

    提示

    servicebuildQuery在构造query时,如果检测到该字段在模型中定义了搜索器,则拿回搜索器的query,如果该字段未在搜索器中定义,如果该字段值是基本类型,将构造=,如果该字段值是数组,并且数组的值是合法的时间区间,将构造between否则构造in

基类的作用

  • 通过protected $connection定义了数据库连接
  • 通过public $timestamps定义了自动维护时间戳,如果不需要自动维护,应该在模型中设置public $timestamps = false
  • 通过const CREATED_ATconst UPDATED_AT定义了需要自动维护时间戳的字段名
  • 通过protected $dateFormat定义了时间戳存储格式
  • 通过const DATA_LIMIT_FIELD定义数据范围控制字段,在需要的模型中具体定义
  • 通过protected function serializeDate修改了json中的时间格式

Eloquent ORM的拓展

Eloquent ORM不能很好的支持表别名,特别是在开启软删除时,表别名($this->model->setTable("sys_dept as d"))会导致Eloquent ORM构造的SQL出现错误,基类中重写的qualifyColumn方法解决了这一问题

php
    public function qualifyColumn($column)
    {
        if (str_contains($column, '.')) {
            return $column;
        }
        if (strpos(strtolower($this->getTable()), ' as ') > 0) {
            preg_match('/^[\s|\w]+as\s+(\w+)\s*$/i',
                $this->getTable(), $matches);
            $as = $matches[1] ?? '';
        }
        if (!empty($as)) {
            return $as.'.'.$column;
        } else {
            return $this->getTable().'.'.$column;
        }

    }