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

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

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