Использование аксессора по умолчанию

03 Мая 2022 02:08

Аксессор (Accessor) в laravel нужен для создания кастомного поля модели. Это означает, что помимо полей из базы, будет доступно еще и искусственно добавленное поле.
Но, как известно, чтобы аксессор работал, к нему нужно обратиться.

Например, у нас есть аксессор:

public function getUserNameAttribute()
{
    return $this->user()->get()[0]->name;
}

Работать он будет так:

echo $model->user_name;

Но что если у нас, например, API и надо генерировать его автоматически при получении данных? По хорошему, должен быть слой ресурсов, где будут четко заданы поля для вывода, там и будет обращение к конкретному аксессору. Но если API берет данные и сразу их отдает то решением этого вопроса будет свойство appends. Добавляем в этой же модели свойство appends в качестве массива и в ключах перечисляем нужные аксессоры (при условии что они есть). По примеру выше это будет так:

protected $appends = ['user_name'];

После этого аксессор не нужно будет вызывать, он будет подгружен в модель автоматически.

Ссылка на документацию - https://laravel.su/docs/8.x/eloquent-serialization#appending-values-to-json