У меня есть объект 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






Проблема заключается в ленивой загрузке коллекций Doctrine, что указано в свойстве PersistentCollection объекта initialized, что в вашем случае false. Это означает, что он не был инициализирован.
Обычно это довольно умно, поскольку обычно вам не нужно загружать все отношения ваших сущностей (и эти связанные сущности могут сами иметь отношения и т. д.). Вместо этого постоянная коллекция будет действовать как прокси/оболочка и загружать содержимое коллекции только после фактического доступа к какой-либо части коллекции.
Некоторые реализации коллекций имеют интересное поведение, поэтому я бы посоветовал не выставлять коллекции «снаружи» вашей сущности. Поэтому мой совет — заменить getFiles на return $this->files->toArray() и сделать свойство $filesprivate.
Впрочем, это всего лишь совет. В любом случае, вызов toArray() для любой коллекции должен инициализировать ее и заставить вести себя как ожидаемый массив.
Я попробовал решение Jakumi. Это просто не сработало для меня. В итоге у меня сработало (Symfony 4.4)
public function getItems()
{
return iterator_to_array($this->items);
}
Вызов функции также немедленно заполняет коллекцию в объекте.