Skip to content

7.4. Eloquent: Мутаторы и Кастинг

1. Введение

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

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

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

Аксессор преобразует значение атрибута Eloquent при его получении. Чтобы определить аксессор, создайте защищенный метод в модели, который будет представлять доступный атрибут. Имя этого метода должно соответствовать представлению атрибута модели / столбца базы данных в формате "camel case", если это применимо.

В этом примере мы определим аксессор для атрибута first_name. Аксессор будет автоматически вызываться Eloquent при попытке получить значение атрибута first_name. Все методы аксессоров / мутаторов атрибутов должны указывать тип возвращаемого значения Illuminate\Database\Eloquent\Casts\Attribute:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
/**
* Get the user's first name.
*/
protected function firstName(): Attribute
{
return Attribute::make(
get: fn (string $value) => ucfirst($value),
);
}
}

Все методы аксессоров возвращают экземпляр Attribute, который определяет, как будет получен атрибут и, при необходимости, как он будет изменен. В этом примере мы определяем только способ получения атрибута. Для этого мы передаем аргумент get в конструктор класса Attribute.

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

lightbulb

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