Неопределенный индекс при доступе к связи OneToMany в сущности доктрины

У меня есть следующая структура сущностей для моих таблиц: https://gist.github.com/melokki/e2e0d7c03ee71c37c1185602562da6af

$movie = $repository->findOneBy([
    'title' => 'movie title',
]);

Я пытаюсь получить доступ к таким источникам фильмов:

$movie->getSources()

и на основе документации я могу это сделать, но сейчас я получаю следующее уведомление

Notice: Undefined index: movie

и я не могу понять почему

Что-то не так с моим кодом?

Сообщение об ошибке означает, что где-то вы пытаетесь получить доступ к массиву с индексом «фильм». Вероятно, не имеет отношения к getSources (). Может быть, вы забыли добавить $ movie к своим данным о ветке? Просто дикая догадка. Найдите фильм в своем коде и посмотрите, что появится.

Cerad 18.05.2018 15:43

Я не пытаюсь получить доступ к методу getSources() из представления. Я в команде cli. Судя по документации из Doctrine, мои сущности верны, но что-то все еще не так, и я не могу понять, что именно. Я понимаю, что индекс movie отсутствует, но не могу понять, как его установить. уведомление исходит от BasicEntityPersister

melokki 18.05.2018 15:47

На самом деле ничего не выскакивает из ваших сопоставлений по существу. Убедитесь, что у вас нет старых файлов сопоставления yaml / xml, скрытых в разделе "Ресурсы". Суть не показывает Movie :: getSources, поэтому я не могу сказать, проблема ли в этом. Я также не могу сказать, является ли Movie :: movieSource массивом. Судя по написанию, это не так.

Cerad 18.05.2018 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
1 447
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На основе вашей ссылки на github для ваших объектов:

Первый

Вы не можете сделать $movie->getSources(), так как в вашем классе Movie нет поля с именем $sources

Второй

В вашем объекте-фильме есть поле с именем $movieSource, которое является отношением "один ко многим". Его следует переименовать в $movieSources, потому что вы получите ArrayCollection объектов MovieSource.

Я подозреваю, что вы хотите смоделировать отношение ManyToMany с помощью Movie <-> Source?

Если да, вы можете напрямую связать эти объекты друг с другом, не беспокоясь о промежуточной таблице, doctrine сделает это за вас.

Глянь сюда: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#many-to-many-bidirectional

Я настоятельно рекомендую отказаться от промежуточной таблицы, если для нее нет реального использования.

Но если вы хотите сохранить эту модель, вам придется вызвать (после изменения имени метода)

$movie->getMovieSources() 

и перебрать эту коллекцию.

for ($movie->getMovieSources() as $movieSource) {
  $moviesource->getSource();
}

Скорее всего, ваша исходная запрошенная ошибка исчезла с этими изменениями.

Вы правы, я хочу смоделировать отношения "многие ко многим" между фильмом и источником, но в то же время я хочу сохранить некоторую дополнительную информацию в сводной таблице (описание фильмов), это может быть плохо, но на данный момент у меня нет других идей, как сохранить описание фильма, поскольку оно разное для каждого источника. Мой метод getSources фактически возвращает свойство объекта movieSource, поэтому я пытаюсь вызвать этот метод. Попробую обновить суть полным кодом. Также свойство movieSource инициализируется как ArrayCollection в конструкторе.

melokki 18.05.2018 17:40

Нет, это не плохо. Если есть необходимость (как в вашем случае), все в порядке. Но пока вы не можете использовать $ movie-> getSources (), пока не реализуете такой метод (на мой взгляд, нет правильного дизайна). Ошибка исчезла? А как насчет класса AbstractEntity?

Jim Panse 22.05.2018 09:08

Я выполнил команду doctrine:schema:validate и теперь думаю, что понял. Моя проблема в том, что в MovieSchema для свойства $movie у меня есть две аннотации для поля @ORM\Column(type = "string", name = "movie_id") и @ORM\JoinColumn(name = "movie_id", referencedColumnName = "id", nullable=false). Я удалил первый и теперь получаю желаемый результат при вызове метода getSources. Большое спасибо за ваше время.

melokki 22.05.2018 09:53
Ответ принят как подходящий

Я выполнил команду doctrine: schema: validate и теперь, кажется, понял.

Моя проблема в том, что в MovieSchema для свойства $movie у меня есть две аннотации для поля: @ORM\Column(type = "string", name = "movie_id") и @ORM\JoinColumn(name = "movie_id", referencedColumnName = "id", nullable=false).

Я удалил первый и теперь получаю желаемый результат при вызове метода getSources.

Большое спасибо за ваше время.

Другие вопросы по теме