ще 10 трюків

ще 10 трюків

https://t.me/enot_it

11. Сортування по геттеру

Взяти до прикладу стандартний і часто використовуваний геттер

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]);

















Report Page