
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 кажется не тривиальным, но может быть полезно в случаях, когда мы должны быть уверенны в уникальности записи в базе данных.

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном пр...
Читать →
Для быстрого деплоя личных или простых проектов можно использовать сервисы подобные Envoyer.io о котором писал ранее или написать свой велосипед на ba...
Читать →
Для защиты форм от спама полезно добавлять всем надоевшую reCaptcha от Google, которая существенно позволяет сократить количество сообщений от ботов н...
Читать →