7 хитростей работы с моделями в Laravel

Когда впервые начинал работать с Laravel, я чувствовал, что есть много вещей, которые можно сделать лучше, когда доходило до реализации моделей. После погружения в класс Eloquent Model я обнаружил некоторые интересные вещи, значительно облегчающие работу с моделями.

В этой статье я дам вам семь советов, которые должен знать каждый, использующий Laravel, для получения максимальную отдачи от ваших моделей.

#1 Создание модели

При создании модели из командной строки вы можете указать папку, в которой должна быть создана модель. Все, что вам нужно сделать, это ввести имя папки перед названием модели. Это полезно, когда ваши модели не хранятся в дефолтной папке.

  1. php artisan make:model Models/Product

Это создаст модель Product в папке app/Models и сэкономит ваше время на перенос модели вручную в нужную папку.

#2 Преобразование атрибутов

Свойство $casts предоставляет способ преобразования атрибутов к определенным типам данных.

  1. protected $casts = [
  2. ‘is_published’ => ‘boolean’
  3. ];

Атрибут is_published теперь, при обращении к нему, всегда будет преобразовываться в логическое значение, даже если он хранится вашей базе данных как число. Есть много типов, к которым вы можете привести свои атрибуты, например, date и datetime.

Я часто вижу ошибку, когда атрибуты date и datetime форматируются в шаблонах Blade так:

  1. {{ $blog->created_at->format(‘Y-m-d’) }}

В некоторых шаблонах Blade даже бывает, что форматирование происходит несколько раз для одной и той же переменной. Это можно сделать более эффективно с помощью свойства $casts .

Для преобразования даты и времени вы можете указать формат:

  1. protected $casts = [
  2. ‘published_at’ => ‘datetime:Y-m-d’,
  3. ];

Теперь атрибут published_at всегда будет возвращать  в формате Y-m-d и больше не нужно делать никакого форматирования в шаблонах Blade.

#3 Видимость

Некоторые атрибуты не должны включаться в массив и JSON-представление модели, например пароль. Для этого используется свойство $hidden.

  1. protected $hidden = [
  2. ‘password’
  3. ];

Свойство $hidden действует как черный список. В качестве альтернативы вы можете использовать свойство $visible для белого списка.

  1. protected $visible = [
  2. ‘first_name’,
  3. ‘last_name’
  4. ];

Когда в модели установлено свойство $visible, остальные атрибуты будут автоматически скрыты. Это работает так же, как свойства $fillable и $guarded.

#4 Читатели (Accessors)

Иногда необходимо объединить несколько атрибутов в один или просто отформатировать его. Это можно сделать с помощью читателей.

Предположим, что у вас есть модель User, у которой есть first_name и last_name. Если вы хотите отобразить полное имя пользователя, то вы можете сделать так:

  1. $this->first_name . ‘ ‘ . $this->last_name

Но это очень наивный подход. Laravel решает это с помощью читателя. Метод читателя — это метод, определенный в модели со следующим синтаксисом:

  1. get[NameOfAttribute]Attribute

Читатель для полного имени пользователя будет выглядеть так:

  1. public function getFullNameAttribute() {
  2. return «{$this->first_name} {$this->last_name}»;
  3. }

Теперь, чтобы получить доступ к его значению, нужно вызвать:

  1. $user->full_name
#5 Преобразователи (Mutators)

Преобразователи позволяют манипулировать значениями и устанавливать его в свойстве $attribute модели Eloquent. Они имеют тот же синтаксис как у читателя.

  1. public function setLastNameAttribute($value) {
  2. $this->attributes[‘last_name’] = ucfirst($value);
  3. }

Этот мутатор применит функцию ucfirst к фамилии и сохранит результат в свойстве $attribute.

  1. $user->last_name = ‘jones’; // Результат будет: `Jones`
#6 Добавление значений

Когда у модели есть читатели и отношения, то по умолчанию они не не добавляются в массив и JSON-представление модели. Для этого вы должны добавить читать или отношение к атрибуту $appends. На примере читателя getFullNameAttribute:

  1. $appends = [
  2. ‘full_name’
  3. ];

Примечание: Читатель, добавленный к атрибуту $appends, используется в змеином_регистре (snake_case), даже если был определен в ВерблюжемРегистре (CamelCase).

Предположим, что модель User имеет отношение один-ко-многим с моделью Blog.

  1. public function blogs() {
  2. return $this->hasMany(App\Blog::class);
  3. }

Чтобы добавить блоги к модели, вы можете просто добавить их в атрибут $appends:

  1. $appends = [
  2. ‘full_name’,
  3. ‘blogs’
  4. ];

Также можно указать атрибуты, которые должны быть добавлены. Например, вы хотите, чтобы были добавлены только идентификатор и заголовок.

  1. $appends = [
  2. ‘full_name’,
  3. ‘blogs:id,title’
  4. ];
#7 Касания (touches)

Когда модель имеет отношение «Многие к Одному» или «Многие ко Многим» с другой моделью, в данном случае это комментарий, принадлежащий блогу, в некоторых случаях может быть полезно обновить метку времени родителя при обновлении дочернего элемента. Это можно сделать, добавив отношение к атрибуту $touch.

  1. class Comment extends Model
  2. {
  3. protected $touches = [‘blog’];
  4. public function blog()
  5. {
  6. return $this->belongsTo(App\Blog::class);
  7. }
  8. }

Теперь, при обновлении модели Комментарий, автоматически обновится атрибут updated_at у блога.