РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
686 of 1392 menu

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,
    которое возникает при отложенной загрузке отношений, если она запрещена
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить