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
в экземпляре модели:
Если вы хотите, чтобы эти вычисляемые значения добавлялись в массивные / JSON представления вашей модели, вам нужно будет добавить их.