Сниппеты
Кусочки кода для разных ситуаций. Кейсы использования.
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'); // -1
X или 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');
});
}