Laravel 5.5
Аксессоры и мутаторы
Введение
Аксессоры и мутаторы дают возможность изменить формат значений Eloquent атрибутов при их извлечении из объекта модели или сохранении в объект модели. Например, в базе данных вы храните зашифрованные с помощью Laravel encrypter данные, тогда можно их автоматически расшифровывать в Eloquent модели.
Eloquent может автоматически преобразовывать даты в Carbon объекты и даже текстовые поля в JSON.
Аксессоры и мутаторы
Создание аксессора
Для создания аксессора необходимо в модели определить метод getFooAttribute , где Foo – это “studly case” имя столбца, к которому вы хотите получить доступ. В примере ниже мы создаем аксессор для атрибута с именем first_name . Аксессор будет автоматически вызываться Eloquent-ом при попытке получить значение атрибута first_name :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * Get the user's first name. * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } } |
Исходное значение столбца передается в аксессор, далее происходит преобразование и возвращается итоговое значение. Для доступа к значению аксессора объекта модели вы можете использовать простую запись:
1 2 3 4 5 |
$user = App\User::find(1); $firstName = $user->first_name; |
Создание мутатора
Для создания мутатора необходимо в модели определить метод setFooAttribute , где Foo – это “studly case” имя столбца, к которому вы хотите получить доступ. В примере ниже мы создаем мутатор для атрибута с именем first_name . Этот мутатор будет автоматически вызываться при попытке установить значение атрибута first_name в модели объекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * Set the user's first name. * * @param string $value * @return void */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); } } |
Мутатор получает значение, которые было задано для атрибута first_name, преобразует его и итоговое значение сохраняет во внутреннем свойстве $attributes . Например, присвоим атрибуту first_name значение Sally :
1 2 3 4 5 |
$user = App\User::find(1); $user->first_name = 'Sally'; |
Тогда будет вызван метод setFirstNameAttribute с параметром $value, равным Sally . Мутатор применит к нему функцию strtolower и сохранит результат во внутреннем массиве $attributes .
Мутаторы даты
По умолчанию Eloquent преобразует столбцы created_at и updated_at в объекты класса Carbon. Это расширение php-класса DateTime с множеством полезных методов. Вы можете сами определить, какие именно даты будут автоматически преобразовываться, определив свойство $dates в модели. Можно даже полностью отключить этот мутатор.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that should be mutated to dates. * * @var array */ protected $dates = [ 'created_at', 'updated_at', 'deleted_at' ]; } |
Когда столбец определен как дата, вы можете присвоить значение в виде UNIX timestamp, строки формата даты (Y-m-d) или даты-время и, конечно, объекта класса DateTime или Carbon. И это значение будет корректно сохранено в вашу базу:
1 2 3 4 5 6 7 |
$user = App\User::find(1); $user->deleted_at = Carbon::now(); $user->save(); |
При получении значений атрибутов, указанных в свойстве $dates, они автоматически преобразуются в объекты Carbon, к которым вы можете применять любые функции этого класса:
1 2 3 4 5 |
$user = App\User::find(1); return $user->deleted_at->getTimestamp(); |
Форматы дат
По умолчанию timestamps имеют формат ‘Y-m-d H:i:s’. Для изменения формата определите свойство $dateFormat в вашей модели. Этот свойство описывает формат атрибуты для хранения в базе данных и для сериализации модели в массив или JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The storage format of the model's date columns. * * @var string */ protected $dateFormat = 'U'; } |
Кастинг (casting) атрибутов
Свойство $casts в вашей модели предназначено для преобразования значений атрибутов в следующие типы данных: integer, real, float, double, string, boolean, object, array, collection, date, datetime, timestamp. Это свойство – массив, в котором ключи – имена атрибутов, значения – тип данных, в который необходимо преобразовать атрибуты.
Например, возьмем атрибут is_admin, который хранится в базе данных как integer (0 или 1) и преобразуем его в boolean:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ]; } |
Теперь атрибут is_admin всегда будет типа boolean, несмотря на то, что исходное значение хранится в базе как integer:
1 2 3 4 5 6 7 |
$user = App\User::find(1); if ($user->is_admin) { // } |
Кастинг в массив и в JSON
Кастинг в массив особенно полезен при работе со столбцами, которые содержат данные в виде сериализации JSON. Пусть база данных содержит поле options типа json или text c cериализованным JSON. Добавим array для этого атрибута в свойство casts :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'options' => 'array', ]; } |
Теперь при обращении к этому атрибуту значение будет автоматически десериализовано из JSON в стандартный массив PHP. Присваивание атрибуту значения приведет к обратному: автоматическая сериализация в JSON для сохранения в базу данных.
1 2 3 4 5 6 7 8 9 10 11 |
$user = App\User::find(1); $options = $user->options; $options['key'] = 'value'; $user->options = $options; $user->save(); |