获取器

命名规范为:

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'] = '[email protected]';
$user->data($data, true);
$user->save();
echo $user->name; // thinkphp

如果为nameemail字段都定义了修改器的话,都会进行处理。

方法3-使用save方法触发,例如:

$user = new User();
$data['name'] = 'THINKPHP';
$data['email'] = '[email protected]';
$user->save($data);
echo $user->name; // thinkphp

注意:修改器方法仅对模型的写入方法有效,调用数据库的写入方法写入无效,例如下面的方式修改器无效。

$user = new User();
$data['name'] = 'THINKPHP';
$data['email'] = '[email protected]';
$user->insert($data);
12-26 11:08