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

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 Nova - Как вывести в трендах сумму за период
24.02.2021
8
Laravel Nova - Как вывести в трендах сумму за период

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

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

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

Читать →
reCaptcha v2 для Laravel
21.02.2021
29
reCaptcha v2 для Laravel

Для защиты форм от спама полезно добавлять всем надоевшую reCaptcha от Google, которая существенно позволяет сократить количество сообщений от ботов н...

Читать →