Laravel когда использовать sole()
26.01.2021
330

Laravel когда использовать sole()

Работая с Query Builder в Laravel мы можем получить нужную запись несколькими способами:


use App\Models\Post;

$posts = Post::where('status', 'published')->get(); // Все записи
$post = $posts->first(); // Первая запись, может отсутствовать

$posts = Post::where('status', 'published')->first(); // Первая запись, может отсутствовать


Но что если нам нужно получить только одну запись, и при этом быть уверенным, что она единственная, согласно нашим условиям в запросе.


До версии Laravel 8.23 необходимо добавлять доп. проверки для подсчета количества моделей с одинаковыми заданными свойствами.


К счастью мы может использовать метод "sole()", который вернет ошибку, если запись не существует или таких записей несколько


Примеры использования метода "sole()"


В базе данных Post не существует модели, у которой статус "published", получим ошибку "Illuminate\Database\Eloquent\ModelNotFoundException"


use App\Models\Post;
use Illuminate\Database\Eloquent\ModelNotFoundException;

try {
    $post = Post::where('status', 'published')->sole();
} catch (ModelNotFoundException $e) {
    dd($e->getMessage());
}


В базе данных Post присутствуют несколько моделей, у которой статус "published", получим ошибку "Illuminate\Database\Eloquent\MultipleRecordsFoundException"


use App\Models\Post;
use Illuminate\Database\Eloquent\MultipleRecordsFoundException;

try {
    $post = Post::where('status', 'published')->sole();
} catch (MultipleRecordsFoundException $e) {
    dd($e->getMessage());
}


Так же в метод "sole()" можно передать список колонок, которые нужно вернуть в виде строки или массива.

/**
 * Execute the query and get the first result if it's the sole matching record.
 *
 * @param  array|string  $columns
 * @return \Illuminate\Database\Eloquent\Model|object|static|null
 *
 * @throws \Illuminate\Database\RecordsNotFoundException
 * @throws \Illuminate\Database\MultipleRecordsFoundException
 */
public function sole($columns = ['*'])
{
    $result = $this->take(2)->get($columns);
    // ...
}


Использование sole кажется не тривиальным, но может быть полезно в случаях, когда мы должны быть уверенны в уникальности записи в базе данных.

Источник: ZetRider
Тестирование и отладка роутов Laravel при помощи DebugBar
09.10.2021
30
Тестирование и отладка роутов Laravel при помощи DebugBar

Для тестирования роутов на наличие дубликата sql запросов, потребления памяти или времени загрузки можно использовать удобный интерфейс laravel-debugb...

Читать →
Laravel Nova - Как вывести в трендах сумму за период
24.02.2021
579
Laravel Nova - Как вывести в трендах сумму за период

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном пр...

Читать →
Bash деплой - аналог Envoyer
24.02.2021
652
Bash деплой - аналог Envoyer

Для быстрого деплоя личных или простых проектов можно использовать сервисы подобные Envoyer.io о котором писал ранее или написать свой велосипед на ba...

Читать →