Model层详解

模型属于dao层之上,专门处理数据库字段、表名、主键、伪删除等配置。主要存放:模型初始化操作、模型事件操作、模型修改器、获取器、搜索器、模型关联等。

我们在开发中常用的有

模型事件操作、模型修改器、获取器、搜索器、模型关联,尤其是模型关联和搜索器的使用比较广泛

使用搜索器

封装某个字段的查询条件,可以完成一些较为复杂的查询,一个搜索器对应一个特殊的方法,方法命令规范为:

search[fieldName]Attr

fieldName为数据库字段的驼峰转换,搜索器在调用withSearch方法时触发执行

例如需要给User模型定义name字段和时间字段的搜索器可以使用

<?php
namespace app\model;

use crmeb\basic\BaseModel;

class User extends BaseModel 
{
    public function searchNameAttr($query, $value, $data)
    {
        $query->where('name','like', $value . '%');
    }

    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime('create_time', $value[0], $value[1]);
    }    
}

然后,我们可以使用下面的查询

User::withSearch(['name','create_time'], [
        'name'            =>    'think',
        'create_time'    =>    ['2018-8-1','2018-8-5'],
        'status'        =>    1
    ])
    ->select();

使用修改器

通常在写入数组到数据库中,需要把我们添加的字段装换成json格式,这个时候使用修改器就可以在写入之前自动转换成json格式

修改器方法的命令规范为:

set[FieldName]Attr

其中的FieldName为字段驼峰名称

例如User模型定义other修改器

<?php
namespace app\model;

use crmeb\basic\BaseModel;

class User extends BaseModel 
{
    public function setOtherAttr($value)
    {
        return json_encode($value);
    }
}

使用获取器

获取器的作用是对模型例的数据做出自动处理。获取器和修改器配合使用

获取器的命名规范:

get[FieldName]Attr

FileName为数据表字段的驼峰转换。定义了获取器之后会在下列情况下自动触发:

  • 模型的数据对象取值操作 $model->field_name

  • 模型的序列化输出操作 $model->toArray() 或者 toJson

  • 显式调用getAttr()方案$this->getAttr('field_name')

模型和Dao层的关联

定一个User模型,那么Dao也要增加一个UserDao的类来使用操作模型

例如定义User模型

<?php
namespace app\model;

use crmeb\basic\BaseModel;

class User extends BaseModel 
{

}

dao应用模型将在Dao层详解中示例