RelationNotFoundException
Исключение RelationNotFoundException возникает при попытке
загрузить, выполнить запрос или обратиться к отношению, которое
не определено в модели Eloquent. Это происходит при вызове методов
with, load, has, whereHas и других,
связанных с отношениями. Также исключение может возникнуть при
динамическом обращении к свойству, которое не является отношением.
Синтаксис
<?php
// Исключение выбрасывается автоматически при обращении к несуществующему отношению
RelationNotFoundException::make($model, $relation);
// Пример перехвата исключения
try {
$posts = Post::with('nonExistentRelation')->get();
} catch (RelationNotFoundException $e) {
// Обработка ошибки
echo $e->getMessage();
}
?>
Причины возникновения
Основные причины появления исключения:
- Имя отношения не определено в модели
- Опечатка в названии метода отношения
- Отношение определено в другой модели
- Динамическое свойство не является отношением
Пример
Создадим модель Post с отношением к User и попытаемся
загрузить несуществующее отношение comments:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
// Отношение к пользователю определено
public function user()
{
return $this->belongsTo(User::class);
}
// Отношение comments не определено
}
?>
<?php
namespace AppHttpControllers;
use AppModelsPost;
use IlluminateDatabaseEloquentRelationNotFoundException;
class PostController extends Controller
{
public function index()
{
try {
// Попытка загрузить несуществующее отношение
$posts = Post::with('comments')->get();
} catch (RelationNotFoundException $e) {
echo $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Relation 'comments' not found on model AppModelsPost."
Пример
Исключение также возникает при использовании метода load
для загрузки несуществующего отношения в уже загруженной модели:
<?php
namespace AppHttpControllers;
use AppModelsPost;
use IlluminateDatabaseEloquentRelationNotFoundException;
class PostController extends Controller
{
public function show($id)
{
try {
$post = Post::find($id);
if ($post) {
// Попытка загрузить несуществующее отношение
$post->load('categories');
}
} catch (RelationNotFoundException $e) {
echo "Ошибка: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Ошибка: Relation 'categories' not found on model AppModelsPost."
Пример
Исключение может возникнуть при использовании методов
условной загрузки, таких как has или whereHas:
<?php
namespace AppHttpControllers;
use AppModelsPost;
use IlluminateDatabaseEloquentRelationNotFoundException;
class PostController extends Controller
{
public function published()
{
try {
// Фильтрация по несуществующему отношению
$posts = Post::whereHas('tags', function ($query) {
$query->where('name', 'popular');
})->get();
} catch (RelationNotFoundException $e) {
echo "Отношение не найдено: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Отношение не найдено: Relation 'tags' not found on model AppModelsPost."
Смотрите также
-
исключение
ModelNotFoundException,
которое возникает при отсутствии записи в базе данных -
исключение
QueryException,
которое возникает при ошибках выполнения SQL-запросов -
исключение
MassAssignmentException,
которое возникает при массовом заполнении неразрешённых полей -
исключение
LazyLoadingViolationException,
которое возникает при отложенной загрузке отношений, если она запрещена