Когда впервые начинал работать с Laravel, я чувствовал, что есть много вещей, которые можно сделать лучше, когда доходило до реализации моделей. После погружения в класс Eloquent Model я обнаружил некоторые интересные вещи, значительно облегчающие работу с моделями.
В этой статье я дам вам семь советов, которые должен знать каждый, использующий Laravel, для получения максимальную отдачи от ваших моделей.
#1 Создание модели
При создании модели из командной строки вы можете указать папку, в которой должна быть создана модель. Все, что вам нужно сделать, это ввести имя папки перед названием модели. Это полезно, когда ваши модели не хранятся в дефолтной папке.
php artisan make:model Models/Product
Это создаст модель Product в папке app/Models и сэкономит ваше время на перенос модели вручную в нужную папку.
#2 Преобразование атрибутов
Свойство $casts предоставляет способ преобразования атрибутов к определенным типам данных.
protected $casts = [ 'is_published' => 'boolean' ];
Атрибут is_published теперь, при обращении к нему, всегда будет преобразовываться в логическое значение, даже если он хранится вашей базе данных как число. Есть много типов, к которым вы можете привести свои атрибуты, например, date и datetime.
Я часто вижу ошибку, когда атрибуты date и datetime форматируются в шаблонах Blade так:
{{ $blog->created_at->format('Y-m-d') }}
В некоторых шаблонах Blade даже бывает, что форматирование происходит несколько раз для одной и той же переменной. Это можно сделать более эффективно с помощью свойства $casts .
Для преобразования даты и времени вы можете указать формат:
protected $casts = [ 'published_at' => 'datetime:Y-m-d', ];
Теперь атрибут published_at всегда будет возвращать в формате Y-m-d и больше не нужно делать никакого форматирования в шаблонах Blade.
#3 Видимость
Некоторые атрибуты не должны включаться в массив и JSON-представление модели, например пароль. Для этого используется свойство $hidden.
protected $hidden = [ 'password' ];
Свойство $hidden действует как черный список. В качестве альтернативы вы можете использовать свойство $visible для белого списка.
protected $visible = [ 'first_name', 'last_name' ];
Когда в модели установлено свойство $visible, остальные атрибуты будут автоматически скрыты. Это работает так же, как свойства $fillable и $guarded.
#4 Читатели (Accessors)
Иногда необходимо объединить несколько атрибутов в один или просто отформатировать его. Это можно сделать с помощью читателей.
Предположим, что у вас есть модель User, у которой есть first_name и last_name. Если вы хотите отобразить полное имя пользователя, то вы можете сделать так:
$this->first_name . ' ' . $this->last_name
Но это очень наивный подход. Laravel решает это с помощью читателя. Метод читателя — это метод, определенный в модели со следующим синтаксисом:
get[NameOfAttribute]Attribute
Читатель для полного имени пользователя будет выглядеть так:
public function getFullNameAttribute() { return "{$this->first_name} {$this->last_name}"; }
Теперь, чтобы получить доступ к его значению, нужно вызвать:
$user->full_name
#5 Преобразователи (Mutators)
Преобразователи позволяют манипулировать значениями и устанавливать его в свойстве $attribute модели Eloquent. Они имеют тот же синтаксис как у читателя.
public function setLastNameAttribute($value) { $this->attributes['last_name'] = ucfirst($value); }
Этот мутатор применит функцию ucfirst к фамилии и сохранит результат в свойстве $attribute.
$user->last_name = 'jones'; // Результат будет: `Jones`
#6 Добавление значений
Когда у модели есть читатели и отношения, то по умолчанию они не не добавляются в массив и JSON-представление модели. Для этого вы должны добавить читать или отношение к атрибуту $appends. На примере читателя getFullNameAttribute:
$appends = [ 'full_name' ];
Примечание: Читатель, добавленный к атрибуту $appends, используется в змеином_регистре (snake_case), даже если был определен в ВерблюжемРегистре (CamelCase).
Предположим, что модель User имеет отношение один-ко-многим с моделью Blog.
public function blogs() { return $this->hasMany(App\Blog::class); }
Чтобы добавить блоги к модели, вы можете просто добавить их в атрибут $appends:
$appends = [ 'full_name', 'blogs' ];
Также можно указать атрибуты, которые должны быть добавлены. Например, вы хотите, чтобы были добавлены только идентификатор и заголовок.
$appends = [ 'full_name', 'blogs:id,title' ];
#7 Касания (touches)
Когда модель имеет отношение «Многие к Одному» или «Многие ко Многим» с другой моделью, в данном случае это комментарий, принадлежащий блогу, в некоторых случаях может быть полезно обновить метку времени родителя при обновлении дочернего элемента. Это можно сделать, добавив отношение к атрибуту $touch.
class Comment extends Model { protected $touches = ['blog']; public function blog() { return $this->belongsTo(App\Blog::class); } }
Теперь, при обновлении модели Комментарий, автоматически обновится атрибут updated_at у блога.
Автор: Daan
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.