Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.
Поддержите нас - каждый вклад важен!
Поддержите нас - каждый вклад важен!

Eloquent: Мутаторы

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 11.x. Почему это важно?

Введение

Аксессоры и мутаторы (буквально – читатели и преобразователи) позволяют вам форматировать значения атрибутов Eloquent при их чтении или записи в экземпляры моделей. Например, вы хотите использовать шифратор Laravel, чтобы зашифровать значение, пока оно хранится в базе, и затем автоматически расшифровать атрибут, когда вы обращаетесь к нему в модели Eloquent.

В дополнение к обычным аксессорам и мутаторам Eloquent также автоматически преобразует поля с датами в экземпляры Carbon или даже преобразует текстовые поля в JSON.

Аксессоры и мутаторы

Определение аксессора

Чтобы определить аксессора, создайте метод getFooAttribute в вашей модели, где Foo — отформатированное в соответствии со стилем “studly” название столбца, к которому вы хотите иметь доступ. В данном примере мы определим аксессора для атрибута 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 — отформатированное в соответствии со стилем “studly” название столбца, к которому вы хотите иметь доступ. И снова давайте определим мутатор для атрибута 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);
    }
}

Мутатор получает значение, которое устанавливается в атрибуте, позволяя вам управлять значением и изменять его во внутреннем свойстве $attributes модели Eloquent. Так, например, если мы пытаемся установить атрибут first_name в значение Sally:

$user = App\User::find(1);

$user->first_name = 'Sally';

В этом примере функция setFirstNameAttribute будет вызвана со значением Sally. к имени и установит его результирующее значение во внутреннем массиве $attributes.

Мутаторы дат

По умолчанию Eloquent преобразует столбцы created_at и updated_at в экземпляры Carbon, которые наследуют PHP-класс DateTime и предоставляют ряд полезных методов. Вы можете сами настроить, какие поля автоматически будут преобразовываться, и даже полностью отключить их преобразование, изменив свойство $dates вашей модели:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Атрибуты, которые должны быть преобразованы в даты.
     *
     * @var array
     */
    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at'
    ];
}

Когда столбец является датой, вы можете установить его значение в формат времени UNIX, в строку даты (Y-m-d), в строку даты-времени, и конечно в экземпляр DateTime / Carbon, и значение даты будет автоматически правильно сохранено в вашей базе данных:

$user = App\User::find(1);

$user->deleted_at = Carbon::now();

$user->save();

Как было отмечено выше, полученные атрибуты, которые перечислены в вашем свойстве $dates, будут автоматически преобразованы к экземплярам Carbon, позволяя вам использовать любой из методов Carbon для ваших атрибутов:

$user = App\User::find(1);

return $user->deleted_at->getTimestamp();

Форматы дат

По умолчанию метки времени отформатированы как 'Y-m-d H:i:s'. Если вам нужно настроить формат метки времени, установите значение $dateFormat в своей модели. Это свойство определяет, как атрибуты даты хранятся в базе данных, а также их формат, когда модель преобразована в массив или JSON:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * Формат хранения столбцов с датами модели.
     *
     * @var string
     */
    protected $dateFormat = 'U';
}

Мутаторы атрибутов

Свойство $casts в вашей модели предоставляет удобный метод преобразования атрибутов к общим типам данных. Свойство $casts должно быть массивом, где ключ — название преобразуемого атрибута, а значение — тип, в который вы хотите преобразовать столбец. Поддерживаемые типы для преобразования: integer, real, float, double, string, boolean, object, array, collection, date, datetime и timestamp.

Например, давайте привяжем атрибут is_admin, который сохранен в нашей базе данных как integer (0 или 1) к boolean:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Атрибуты, которые должны быть преобразованы к базовым типам.
     *
     * @var array
     */
    protected $casts = [
        'is_admin' => 'boolean',
    ];
}

Теперь атрибут is_admin будет всегда преобразовываться в boolean, когда вы обращаетесь к нему, даже если само значение хранится в базе данных как integer:

$user = App\User::find(1);

if ($user->is_admin) {
    //
}

Преобразование в массив и JSON

Тип array особенно полезен для преобразования при работе со столбцами, которые хранятся в формате JSON. Например, если у вашей базы данных есть тип поля JSON или TEXT, который содержит сериализированные JSON данные, добавление преобразования в array к этому атрибуту автоматически десериализует атрибут в PHP массив, во время доступа к нему из вашей модели Eloquent:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Атрибуты, которые должны быть преобразованы к базовым типам.
     *
     * @var array
     */
    protected $casts = [
        'options' => 'array',
    ];
}

После определения преобразования вы можете обратиться к атрибуту options , и он будет автоматически десериализован из JSON в PHP массив. Когда вы зададите значение атрибута options, данный массив будет автоматически преобразован обратно в JSON для хранения:

$user = App\User::find(1);

$options = $user->options;

$options['key'] = 'value';

$user->options = $options;

$user->save();