Ассоциации Symfony OneToMany не работают

У меня есть объект Product и объект ProductAttachment. У одного продукта должно быть много насадок. Я использовал сопоставление Doctrine OneToMnay - ManyToOne, но каждый раз, когда я получаю продукт, у него есть пустая коллекция $files

Объект приложения продукта

     * @var \Shopsys\ShopBundle\Model\Product\Product
     * 
 @ORM\ManyToOne(targetEntity = "Shopsys\ShopBundle\Model\Product\Product", inversedBy = "files")
     * @ORM\JoinColumn(nullable=false, name = "product_id", referencedColumnName = "id")
     */
    public $product;

Продукт

     * @var \Shopsys\ShopBundle\Model\Product\ProductAttachment[]|\Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(targetEntity = "\Shopsys\ShopBundle\Model\Product\ProductAttachment", mappedBy = "product", cascade = {"persist"})
     */
    public $files;

    public function getFiles()
    {
        return $this->files;
    }

Я что-то пропустил?

когда я звоню

dump($product->getFiles());

это то, что я получаю

Doctrine\ORM\PersistentCollection #619d
   snapshot private => array ()
   owner private => Shopsys\ShopBundle\Model\Product\Product #e2e7
   association private => array (15)
   em private => Doctrine\ORM\EntityManager #dfae
   backRefFieldName private => "product" (7)
   typeClass private => Doctrine\ORM\Mapping\ClassMetadata #5e75
   isDirty private => false
   collection protected => Doctrine\Common\Collections\ArrayCollection #57e3
   |  elements private => array ()
   initialized protected => false
Стоит ли изучать 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
0
217
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема заключается в ленивой загрузке коллекций Doctrine, что указано в свойстве PersistentCollection объекта initialized, что в вашем случае false. Это означает, что он не был инициализирован.

Обычно это довольно умно, поскольку обычно вам не нужно загружать все отношения ваших сущностей (и эти связанные сущности могут сами иметь отношения и т. д.). Вместо этого постоянная коллекция будет действовать как прокси/оболочка и загружать содержимое коллекции только после фактического доступа к какой-либо части коллекции.

Некоторые реализации коллекций имеют интересное поведение, поэтому я бы посоветовал не выставлять коллекции «снаружи» вашей сущности. Поэтому мой совет — заменить getFiles на return $this->files->toArray() и сделать свойство $filesprivate.

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

Я попробовал решение Jakumi. Это просто не сработало для меня. В итоге у меня сработало (Symfony 4.4)

public function getItems()
{
    return iterator_to_array($this->items);
}

Вызов функции также немедленно заполняет коллекцию в объекте.

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