ще 10 трюків
https://t.me/enot_it11. Сортування по геттеру
Взяти до прикладу стандартний і часто використовуваний геттер
function getFullNameAttribute()
{
return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}
Вам потрібно відсортувати записи по полю full_name? Таке рішення працювати не буде
$clients = Client::orderBy('full_name')->get(); // не працює
Рішення досить просте. Нам потрібно відсортувати записи після того як ми їх отримали.
$clients = Client::get()->sortBy('full_name'); // працює
Зверніть увагу що назви функцій відрізняються - це не orderBy, а sortBy.
12. Сортування по замовчуванню
Що робити, якщо ви хочете, щоб User::all() завжди сортувалося по полю name? Ви можете визначити глобальну заготовку (Global Scope). Повернемося до методу boot(), про який я писала в попередній статті
protected static function boot()
{
parent::boot();
// сортування по полю name в алфавитному порядку
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('name', 'asc');
});
}
13. Сирі вирази
Іноді нам потрібно додати сирі вирази в наш Eloquent запит.
На щастя, для цього є функції
// whereRaw
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();
// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();
// orderByRaw
User::where('created_at', '>', '2016-01-01')
->orderByRaw('(updated_at - created_at) desc')
->get();
14. Репілкація: створення копії запису
Ось найкращий спосіб зробити копію запису в базі даних
$task = Tasks::find(1); $newTask = $task->replicate(); $newTask->save();
15. Chunk() метод для великих таблиць
Не зовсім про Eloquent, це скоріше про колекції, але все ж потужний метод - для обробки великих наборів даних. Ви можете розбити їх на шматочки.
Замість цього
$users = User::all();
foreach ($users as $user) {
// ...
Можна зробити це
User::chunk(100, function ($users) {
foreach ($users as $user) {
// ...
}
});
16. Створення додаткових файлів при створенні моделі
Всі ми знаємо команду artisan, раз ви тут
php artisan make:model Company
Але чи знаєте ви, що є три корисних прапора для створення додаткових файлів моделі?
php artisan make:model Company -mcr
- -m створить файл міграції (migration)
- -c створить контроллер (controller)
- -r вкаже на те, що контроллер має бути ресурсом (resourceful)
17. Перезапис updated_at під час збереження
Чи знаєте ви, що метод ->save() може приймати параметри? Як результат ми можемо "ігнорувати" updated_at.
Як тут, наприклад
$product = Product::find($id); $product->updated_at = '2019-01-01 10:00:00'; $product->save(['timestamps' => false]);
Тут ми переписали updated_at новим значенням
18. Що являється результатом методу update?
Ви колись задумувались над тим, що цей код повертає?
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
Я маю на увазі, що буде містити цей $result?
Відповідь: змінені поля. Тому, якщо вам потрібно перевірити, скільки рядків було змінено, вам не потрібно нічого викликати - метод update() поверне це число для вас.
19. Перетворимо дужки в Eloquent запит
Що робити якщо у вас є AND і OR в вашому SQL запиті, як тут
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
Це неправильний спосіб перетворення
$q->where('gender', 'Male');
$q->orWhere('age', '>=', 18);
$q->where('gender', 'Female');
$q->orWhere('age', '>=', 65);
Порядок неправильний. Правильний спосіб трохи складніший, використовуючи замикання в якості підзапитів
$q->where(function ($query) {
$query->where('gender', 'Male')
->where('age', '>=', 18);
})->orWhere(function($query) {
$query->where('gender', 'Female')
->where('age', '>=', 65);
})
20. orWhere з декількома параметрами
Ви можете передати масив параметрів в orWhere().
“Звичайний” спосіб
$q->where('a', 1);
$q->orWhere('b', 2);
$q->orWhere('c', 3);
А можна так
$q->where('a', 1);
$q->orWhere(['b' => 2, 'c' => 3]);