Unetway

Laravel - Mutators

Вступление

Средства доступа и мутаторы позволяют форматировать значения атрибутов 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
{
    /**
     * Get the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

Как вы можете видеть, исходное значение столбца передается аксессору, что позволяет вам манипулировать и возвращать значение. Чтобы получить доступ к значению метода доступа, вы можете получить доступ к first_nameатрибуту в экземпляре модели:

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

$firstName = $user->first_name;

Вы также можете использовать методы доступа для возврата новых вычисленных значений из существующих атрибутов:

/**
 * Get the user's full name.
 *
 * @return string
 */
public function getFullNameAttribute()
{
    return "{$this->first_name} {$this->last_name}";
}

Если вы хотите, чтобы эти вычисленные значения были добавлены в представления массива / JSON вашей модели, вам необходимо добавить их .

 

Определение Мутатора

Чтобы определить мутатор, определите setFooAttributeметод в вашей модели, где Fooбудет «пошаговое» имя столбца, к которому вы хотите получить доступ. Итак, еще раз, давайте определим мутатор для first_nameатрибута. Этот мутатор будет вызываться автоматически, когда мы попытаемся установить значение first_nameатрибута в модели:

<?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);
    }
}

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

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

$user->first_name = 'Sally';

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

 

Data Mutators

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = [
        'seen_at',
    ];
}

Вы можете отключить стандартные created_atи updated_atвременные метки, установив для общего $timestampsсвойства вашей модели значение false.

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

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

$user->deleted_at = 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
{
    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
    protected $dateFormat = 'U';
}

 

Кастинг атрибутов

$castsСвойство вашей модели обеспечивает удобный способ преобразования атрибутов общих типов данных. $castsСвойство должно быть массивом , где ключ это имя атрибута отливаемой и значение типа вы хотите бросить столбец. Поддерживаемые типы литых являются: integerrealfloatdouble, , , , , , , , , и . При приведении к , вы должны определить количество цифр ( ).decimal:<digits>stringbooleanobjectarraycollectiondatedatetimetimestampdecimaldecimal:2

Чтобы продемонстрировать приведение атрибутов, давайте приведем is_adminатрибут, который хранится в нашей базе данных как целое число ( 0или 1), к логическому значению:

<?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атрибут всегда будет приведен к логическому значению при обращении к нему, даже если базовое значение хранится в базе данных как целое число:

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

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

 

Массив и JSON Casting

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

<?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',
    ];
}

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

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

$options = $user->options;

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

$user->options = $options;

$user->save();

 

Data Casting

При использовании типа dateили datetimeтипа приведения вы можете указать формат даты. Этот формат будет использоваться при сериализации модели в массив или JSON :

/**
 * The attributes that should be cast to native types.
 *
 * @var array
 */
protected $casts = [
    'created_at' => 'datetime:Y-m-d',
];