访问器和修改器可以让你修改 Eloquent 模型中的属性或者设置它们的值,例如,你可能想要使用 Laravel 加密器 来加密一个被保存在数据库中的值,当你从 Eloquent 模型访问该属性时该值将被自动解密。

除了自定义访问器和修改器之外,Eloquent 也会自动将日期字段类型转换成 Carbon 实例或将 文本字段类型转换成 JSON。

定义一个访问器

若要定义一个访问器,则须在你的模型上创建一个 getFooAttribute 方法。要访问的 Foo 字段需使用「驼峰式」来命名。在这个例子中,我们将为 first_name 属性定义一个访问器。当 Eloquent 尝试获取 first_name 的值时,将会自动调用此访问器:

    <?php    
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model
    {
        /**
         * 获取用户的名字。
         *
         * @param  string  $value
         * @return string
         */
        public function getFirstNameAttribute($value)
        {
            return ucfirst($value);
        }
    }

如你所见,字段的原始值被传递到访问器中,让你可以编辑修改并返回结果。如果要访问被修改的值,则可以像这样来访问 first_name 属性:

    $user = App\User::find(1);    
    $firstName = $user->first_name;

定义一个修改器

若要定义一个修改器,则须在模型上定义一个 setFooAttribute 方法。要访问的 Foo 字段需使用「驼峰式」来命名。让我们再来定义 first_name 属性的修改器。当我们尝试在模型上设置 first_name 的值时,将会自动调用此修改器:

    <?php    
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model
    {
        /**
         * 设定用户的名字。
         *
         * @param  string  $value
         * @return void
         */
        public function setFirstNameAttribute($value)
        {
            $this->attributes['first_name'] = strtolower($value);
        }
    }

修改器会获取属性已经被设置的值,让你可以操作该值并将其设置到 Eloquent 模型内部的 $attributes 属性上。举个例子,如果我们尝试将 first_name 属性设置成 Sally:

    $user = App\User::find(1);    
    $user->first_name = 'Sally';

在这个例子中,setFirstNameAttribute 函数将会使用 Sally 作为参数来调用。修改器会对该名字使用 strtolower 函数并将其值设置于内部的 $attributes 数组。