Вступление
Средства доступа и мутаторы позволяют форматировать значения атрибутов 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-d
DateTime
Carbon
$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
Свойство должно быть массивом , где ключ это имя атрибута отливаемой и значение типа вы хотите бросить столбец. Поддерживаемые типы литых являются: integer
, real
, float
, double
, , , , , , , , , и . При приведении к , вы должны определить количество цифр ( ).decimal:<digits>
string
boolean
object
array
collection
date
datetime
timestamp
decimal
decimal: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',
];
0 комментариев