RecordsNotFoundException
Исключение RecordsNotFoundException относится к категории исключений базы данных в Laravel. Оно выбрасывается методами Eloquent, которые ожидают найти одну или несколько записей, но в результате запроса не было получено ни одной. Это исключение является частью механизма гарантированного получения данных и помогает разработчику обрабатывать ситуации, когда данные отсутствуют.
Исключение наследуется от Illuminate\Database\Eloquent\ModelNotFoundException, но используется в контексте методов, возвращающих коллекции или множественные результаты. Основное отличие в том, что RecordsNotFoundException сигнализирует об отсутствии записей в ситуациях, где ожидается наличие как минимум одной записи.
В отличие от ModelNotFoundException, которое обычно выбрасывается при использовании findOrFail для одной модели, RecordsNotFoundException возникает при работе с методами, предназначенными для получения нескольких записей, например, firstOrFail или getOrFail.
Синтаксис
<?php
use Illuminate\Database\Eloquent\Model;
// При использовании методов, выбрасывающих исключение
$records = Model::where('column', 'value')->getOrFail();
// Или с использованием firstOrFail
$record = Model::where('column', 'value')->firstOrFail();
?>
Пример
Давайте попробуем получить все записи с определённым статусом. Если таких записей нет, метод getOrFail выбросит исключение RecordsNotFoundException:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Database\Eloquent\RecordsNotFoundException;
class ArticleController extends Controller
{
public function index()
{
try {
$articles = Article::where('status', 'archived')->getOrFail();
foreach ($articles as $article) {
echo $article->title;
}
} catch (RecordsNotFoundException $e) {
echo "No articles found with status 'archived'";
}
}
}
?>
Результат выполнения кода:
"No articles found with status 'archived'"
Пример
Давайте используем метод firstOrFail для получения первой записи по условию. Если запись не найдена, будет выброшено исключение RecordsNotFoundException:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Database\Eloquent\RecordsNotFoundException;
class UserController extends Controller
{
public function show($role)
{
try {
$user = User::where('role', $role)->firstOrFail();
echo $user->name;
} catch (RecordsNotFoundException $e) {
echo "User with role '{$role}' not found";
}
}
}
?>
Если мы передадим роль, которой нет в базе данных, результат будет следующим:
"User with role 'admin' not found"
Пример
Исключение также может быть вызвано при использовании метода findOrFail с массивом идентификаторов, если ни один из них не найден:
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use Illuminate\Database\Eloquent\RecordsNotFoundException;
class CategoryController extends Controller
{
public function getCategories()
{
$ids = [10, 20, 30];
try {
$categories = Category::findOrFail($ids);
foreach ($categories as $category) {
echo $category->name;
}
} catch (RecordsNotFoundException $e) {
echo "No categories found with ids: " . implode(', ', $ids);
}
}
}
?>
Результат выполнения кода:
"No categories found with ids: 10, 20, 30"
Смотрите также
-
исключение
ModelNotFoundException,
которое выбрасывается при отсутствии конкретной модели -
исключение
MultipleRecordsFoundException,
которое выбрасывается при обнаружении нескольких записей -
исключение
QueryException,
которое выбрасывается при ошибках выполнения SQL-запроса -
исключение
UniqueConstraintViolationException,
которое выбрасывается при нарушении уникальности поля