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

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
Вывод Builder SQL запроса с переданными значениями
09.11.2021
156
Вывод Builder SQL запроса с переданными значениями

Для анализа SQL запросов в Laravel из коробки присутствует метод toSql класса \Illuminate\Database\Eloquent\Builder. Но данный метод возвращает п...

Читать →
Laravel Nova: Множественные поля
28.10.2021
183
Laravel Nova: Множественные поля

Множественные поля для Laravel Nova основаны на хранении данных в json формате свойства модели.GitHubУстановка:composer require zetrider/nova-inputs-f...

Читать →
Тестирование и отладка роутов Laravel при помощи DebugBar
09.10.2021
212
Тестирование и отладка роутов Laravel при помощи DebugBar

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

Читать →