Laracode
Laracode

Eloquent метод “upsert”

Иногда вам может понадобиться обновить несколько записей или создать их, если они не существуют. В Laravel для этого есть удобный метод upsert.

<?php

// Этот код обновит цену всех записей, 
// соответствующих указанным departure и destination, 
// или создаст их, если они не существуют.

Flight::query()->upsert([
    ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], uniqueBy: ['departure', 'destination'], update: ['price']);

Проверка изменения значения ключа модели

Иногда необходимо проверить, было ли значение указанного ключа модели изменено. В Laravel для этого есть метод originalIsEquivalent(), который делает эту задачу простой и удобной 🚀

<?php

// ['name' => 'old']
$user = User::firstOrFail();

$user->name = 'old'; 

// Значение осталось прежним
$user->originalIsEquivalent('name'); // true

$user->name = 'new'; 

// Значение изменилось
$user->originalIsEquivalent('name'); // false

Методы increment и decrement

Иногда нам нужно обновить значение, увеличив или уменьшив его. Обычно для этого пишется отдельный запрос, но в Laravel есть элегантные методы, позволяющие сделать это в одну строчку!

<?php

// Увеличить votes на 1
DB::table('users')->increment('votes');

// Увеличить votes на 5
DB::table('users')->increment('votes', 5);

// Уменьшить votes на 1
DB::table('users')->decrement('votes');

// Уменьшить votes на 5
DB::table('users')->decrement('votes', 5);

// Увеличить votes на 1 и задать name = 'John'
DB::table('users')->increment('votes', 1, ['name' => 'John']);

// Можно увеличивать несколько столбцов сразу
DB::table('users')->incrementEach([
    'votes' => 5,    // Will increment votes by 5    
    'balance' => 100, // Will increment balance by 100
]);

// Эти методы также работают с Eloquent
User::query()->incrementEach([
    'votes' => 5,    // Will increment votes by 5    
    'balance' => 100  // Will increment balance by 100
]);

Laravel методы whereKey и findMany

Знали ли вы, что в Laravel есть методы whereKey и findMany? Они делают ваши запросы where in более читаемыми, а также избавляет от необходимости запоминать имя первичного ключа 🚀

<?php

// 😕 Вместо этого
Post::whereIn('id', [1,2,3])->get();
Post::whereNotIn('id', [1,2,3])->get();

// 😎 Можно вот так
Post::whereKey([1,2,3])->get();
Post::whereKeyNot([1,2,3])->get();

// Или даже вот так
Post::findMany([1,2,3]);

Сортировка запроса случайным образом

Знаете ли вы, что в Laravel есть метод inRandomOrder, который сортирует результаты запроса случайным образом? 🚀

<?php

$randomUser = DB::table('users')
    ->inRandomOrder()
    ->first();

// Или при помощи Eloquent
$randomUser = User::query()
    ->inRandomOrder()
    ->first();

Выполняемый SQL запрос выглядит следующим образом:

SELECT * FROM `users` ORDER BY RAND() LIMIT 1

Eloquent метод withoutTimestamps

Если вы хотите обновить модель, не изменяя updated_at, вы можете использовать метод withoutTimestamps? 🚀

<?php

// Значение колонки updated_at не будет изменено
Post::withoutTimestamps(
    fn () => $post->increment(['reads'])
);

Eloquent метод toQuery

Знаете ли вы, что в Laravel существует метод под названием toQuery? Он позволяет выполнять операции над коллекцией моделей одним запросом, используя фильтрацию по первичному ключу 🚀.

Метод toQuery возвращает экземпляр конструктора запросов Eloquent, в котором автоматически установлено условие whereIn для всех первичных ключей, присутствующих в коллекции.

<?php

$users = User::where('status', 'VIP')->get();

// Отдельный sql запрос на обновление каждой записи
foreach ($users as $user) {
    $user->update(['status' => 'Administrator']);
}

// Один запрос на обновление всех записей
$users->toQuery()->update(['status' => 'Administrator']);

Eloquent метод «withCount»

Знаете ли вы, что с помощью метода «withCount» можно получить количество связанных отношений без их загрузки? Это очень полезно, например, при отображении статистики 🚀.

<?php

$users = User::query()
    ->withCount(['posts'])
    ->get();

// $users->posts_count

Более короткий «whereHas»

Хотя whereHas в Laravel отлично подходит для поиска записей на основе заданных отношений и дополнительных ограничений запроса, существует сокращение под названием «whereRelation», которое решает ту же задачу 🚀.

<?php

// До
Post::whereHas('comments', function ($query) {
    $query->where('created_at', '>', now()->subDay());
})->get();

// После
Post::whereRelation('comments', 'created_at', '>', now()->subDay())->get();

Eloquent метод is() в Laravel

Знаете ли вы, что с помощью Eloquent метода is() можно проверить, являются ли две модели одинаковыми? 🚀

<?php

$user = User::find(1);  
$sameUser = User::find(1);  
$differentUser = User::find(2);

$user->is($sameUser); // true  
$user->is($differentUser); // false