Когда впервые начинал работать с 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 у блога.