php手记之05-tp5获取器与修改器
获取器
命名规范为:
getFieldNameAttr
例如,我们需要对状态值进行转换,可以使用:
<?php class User extends Model { public function getStatusAttr($value) { $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核']; return $status[$value]; } }
$user = User::get(1); echo $user->status; // 例如输出“正常”
如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用:
$user = User::get(1); // 通过获取器获取字段 echo $user->status; // 获取原始字段数据 echo $user->getData('status'); // 获取全部原始数据 dump($user->getData());
模型设置
也可以再控制器里设置(withAttr
方法可以多次调用,对多个字段定义获取器。)
Db::name('user')->withAttr('name', function($value, $data) { return strtolower($value); })->select();
修改器
和获取器相反,修改器的主要作用是对模型设置的数据对象值进行处理。
修改器方法的命名规范为:setFieldNameAttr
应用场景:
修改器的使用场景和读取器类似:
- 时间日期字段的转换写入;
- 集合或枚举类型的写入;
- 数字状态字段的写入;
- 某个字段涉及其它字段的条件或者组合写入
//模型设置
<?php class User extends Model { public function setNameAttr($value) { return strtolower($value); } }
保存name到数据库中的时候会转为小写。
方式2-除了赋值的方式可以触发修改器外,还可以用下面的方法批量触发修改器:
$user = new User(); $data['name'] = 'THINKPHP'; $data['email'] = 'thinkphp@qq.com'; $user->data($data, true); $user->save(); echo $user->name; // thinkphp
如果为name
和email
字段都定义了修改器的话,都会进行处理。
方法3-使用save方法触发,例如:
$user = new User(); $data['name'] = 'THINKPHP'; $data['email'] = 'thinkphp@qq.com'; $user->save($data); echo $user->name; // thinkphp
注意:修改器方法仅对模型的写入方法有效,调用数据库的写入方法写入无效,例如下面的方式修改器无效。
$user = new User(); $data['name'] = 'THINKPHP'; $data['email'] = 'thinkphp@qq.com'; $user->insert($data);