1. 获取器
获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public
类型),方法命名规范为:
get
FieldName
Attr (get字段名Attr)
FieldName
为数据表字段的驼峰转换,定义了获取器之后会在下列情况自动触发:
- 模型的数据对象取值操作(
$model->field_name
); - 模型的序列化输出操作(
$model->toArray()
及toJson()
); - 显式调用
getAttr
方法($this->getAttr('field_name')
);
获取器的场景包括:
- 时间日期字段的格式化输出;
- 集合或枚举类型的输出;
- 数字状态字段的输出;
- 组合字段的输出;
最常用的就是你的数据库中比如存放了某种状态信息,对应-1,1,2,实际的意思可能为不同的状态,删除,禁用,正常,待审核…
利用获取器我们可以在数据查询过程中将数字状态转换为对应的文字,比如:
<?php
namespace app\model;
use think\Model;
class User extends Model
{
protected $table = "user";
// 查询单个用户的方法
public function queryUserById($id=6)
{
$user = User::find($id);
return $user->toArray();
}
// 获取器
public function getStatusAttr($value)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
<?php
namespace app\controller;
use app\BaseController;
use app\model\User;
class test extends BaseController{
public function index(){
$model = new User();
$data = $model->queryUserById();
dump($data) ;
}
}
tips:当你定义获取器后,你想得到原始的数据信息,可以通过getData()
方法来获取原始的数据。
2. 修改器
和获取器相反,修改器的主要作用是对模型设置的数据对象值进行处理。
修改器方法的命名规范为:
set
FieldName
Attr (set字段名Attr)
修改器的使用场景和读取器类似:
- 时间日期字段的转换写入;
- 集合或枚举类型的写入;
- 数字状态字段的写入;
- 某个字段涉及其它字段的条件或者组合写入;
定义了修改器之后会在下列情况下触发:
- 模型对象赋值;
- 调用模型的
data
方法,并且第二个参数传入true
; - 调用模型的
appendData
方法,并且第二个参数传入true
; - 调用模型的
save
方法,并且传入数据; - 显式调用模型的
setAttr
方法; - 显式调用模型的
setAttrs
方法,效果与appendData
并传入true
的用法相同;
tips: 修改器方法仅对模型的写入方法有效,调用数据库的写入方法写入无效
最常见的就是往数据库插入数据时,比如说一些涉及金额的字段值,将你传入的值转换为浮点型…
<?php
namespace app\model;
use think\model;
class Shops extends Model{
protected $table = "shops";
public function addShops(){
$shop = Shops::create([
'shop_name'=>'茶叶',
'shop_price'=>'1999.9',
'addtime'=>date("y-m-d")
]);
return $shop->toArray();
}
// 金额字段修改器
public function setShopPriceAttr($value){
return floatval($value);
}
}
<?php
namespace app\controller;
use app\BaseController;
use app\model\Shops;
class test extends BaseController{
public function index(){
$model = new Shops();
$data = $model->addShops();
dump($data) ;
}
}
3. 搜索器
搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是public
类型),方法命名规范为:
search
FieldName
Attr (search字段名Attr)
FieldName
为数据表字段的驼峰转换,搜索器仅在调用withSearch
方法的时候触发。
搜索器的场景包括:
- 限制和规范表单的搜索条件;
- 预定义查询条件简化查询;
比如:查询一个name包含J,age>16的用户信息,如下。
<?php
namespace app\model;
use think\model;
class User extends Model{
protected $table = "user";
public function queryUserLike(){
$user = User::withSearch(['name','age'],[
'name'=>'J',
'age'=>'16',
])->select();
return $user->toArray();
}
// 自定义搜索器 search`FieldName`Attr,每个字段名对应一个搜索器
public function searchNameAttr($query, $value, $data){
$query->where('name','like', '%'.$value . '%');
}
public function searchAgeAttr($query, $value, $data){
$query->where('age','>', $value );
}
}
<?php
namespace app\controller;
use app\BaseController;
use app\model\User;
class test extends BaseController{
public function index(){
$model = new User();
$data = $model->queryUserLike();
dump($data) ;
}
}
tp6快结束啦,可以差不多该准备写个小项目了!- ^_^ -!