Когда впервые начинал работать с Laravel, я чувствовал, что есть много вещей, которые можно сделать лучше, когда доходило до реализации моделей. После погружения в класс Eloquent Model я обнаружил некоторые интересные вещи, значительно облегчающие работу с моделями.
В этой статье я дам вам семь советов, которые должен знать каждый, использующий Laravel, для получения максимальную отдачи от ваших моделей.
При создании модели из командной строки вы можете указать папку, в которой должна быть создана модель. Все, что вам нужно сделать, это ввести имя папки перед названием модели. Это полезно, когда ваши модели не хранятся в дефолтной папке.
php artisan make:model Models/ProductЭто создаст модель Product в папке app/Models и сэкономит ваше время на перенос модели вручную в нужную папку.
Свойство $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.
Некоторые атрибуты не должны включаться в массив и JSON-представление модели, например пароль. Для этого используется свойство $hidden.
protected $hidden = [
'password'
];
Свойство $hidden действует как черный список. В качестве альтернативы вы можете использовать свойство $visible для белого списка.protected $visible = [
'first_name',
'last_name'
];
Когда в модели установлено свойство $visible, остальные атрибуты будут автоматически скрыты. Это работает так же, как свойства $fillable и $guarded.
Иногда необходимо объединить несколько атрибутов в один или просто отформатировать его. Это можно сделать с помощью читателей.
Предположим, что у вас есть модель 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