Appearance
模型层
模型层使用了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_name
和config_key
一起进行校验
搜索器的定义
php
public function searchConfigNameAttr($query, $value, $data)
{
$query->where('config_name','like', '%' . $value . '%');
}
- 搜索器的方法应该是
public
的 - 搜索器的方法名应该是
search
+大驼峰字段名+Attr
组成提示
service
的buildQuery
在构造query时,如果检测到该字段在模型中定义了搜索器,则拿回搜索器的query,如果该字段未在搜索器中定义,如果该字段值是基本类型,将构造=
,如果该字段值是数组,并且数组的值是合法的时间区间,将构造between
否则构造in
基类的作用
- 通过
protected $connection
定义了数据库连接 - 通过
public $timestamps
定义了自动维护时间戳,如果不需要自动维护,应该在模型中设置public $timestamps = false
- 通过
const CREATED_AT
和const 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;
}
}