Eloquent



Инкрементация и декрементация

Вместо этого:

$article = Article::find($article_id);

$article->read_count++;

$article->save();

Вы можете сделать так:

$article = Article::find($article_id);

$article->increment('read_count');

Так тоже будет работать:

Article::find($article_id)->increment('read_count');

Article::find($article_id)->increment('read_count', 10); // +10

Product::find($produce_id)->decrement('stock'); // -1X или Y методы

Eloquent есть несколько функций, которые объединяют два метода, например “пожалуйста, сделай X, иначе сделай Y”.

Пример 1 – findOrFail():

Вместо этого:

$user = User::find($id);

if (!$user) { abort (404); }

Делаем это:

$user = User::findOrFail($id);

Пример 2 – firstOrCreate():

Вместо этого:

$user = User::where('email', $email)->first();

if (!$user) {

 User::create([

 'email' => $email

 ]);

}

Делаем это:

$user = User::firstOrCreate(['email' => $email]);Метод boot() модели

В модели Eloquent есть волшебный метод boot(), где вы можете переопределить поведение по умолчанию:

class User extends Model

{

 public static function boot()

 {

 parent::boot();

 static::updating(function($model)

 {

 // выполнить какую-нибудь логику

 // переопределить какое-нибудь свойство, например $model->something = transform($something);

 });

 }

}

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

public static function boot()

{

 parent::boot();

 self::creating(function ($model) {

 $model->uuid = (string)Uuid::generate();

 });

}

Свойства модели: timestamps, appends и тд.

Существует несколько «параметров» Eloquent модели в виде свойств класса. Самые популярные из них, вероятно, следующие:

class User extends Model {

 protected $table = 'users';

 protected $fillable = ['email', 'password']; // какие поля могут быть заполнены выполняя User::create()

 protected $dates = ['created_at', 'deleted_at']; // какие поля будут типа Carbon

 protected $appends = ['field1', 'field2']; // доп значения возвращаемые в JSON

}

Но  есть еще:

protected $primaryKey = 'uuid'; // не должно быть "id"

public $incrementing = false; // и не должно быть автоинкрементом

protected $perPage = 25; // Да, вы можете переопределить число записей пагинации (по умолчанию 15)

const CREATED_AT = 'created_at';

const UPDATED_AT = 'updated_at'; // Да, даже эти названия также могут быть переопределены

public $timestamps = false; // или не использоваться совсем

И есть еще больше, для более подробной информации ознакомьтесь с кодом по умолчанию abstract Model class и посмотрите все используемые трэйты.WhereX

Есть элегантный способ превратить это:

$users = User::where('approved', 1)->get();

В это:

$users = User::whereApproved(1)->get(); 

Да, вы можете изменить имя любого поля и добавить его как суффикс в “where”, и оно будет работать как по волшебству.Также в Eloquent ORM есть предустановленные методы, связанные с датой и временем:

User::whereDate('created_at', date('Y-m-d'));

User::whereDay('created_at', date('d'));

User::whereMonth('created_at', date('m'));

User::whereYear('created_at', date('Y'));Сортировка по умолчанию

Что делать, если вы хотите, чтобы User::all() всегда сортировался по полю name? Вы можете назначить глобальную заготовку (Global Scope). Вернемся к методу boot (), о котором мы уже говорили выше.

protected static function boot()

{

 parent::boot();

 // Сортировка по полю name в алфавитном порядке

 static::addGlobalScope('order', function (Builder $builder) {

 $builder->orderBy('name', 'asc');

 });

}