Débutant sur Symfony2, je bute sur un problème depuis 3 jours et impossible de comprendre.

J'ai deux entités : Zone et Enceinte. Une enceinte est forcement liée à une zone et il est possible depuis la zone de récupérer toutes les enceintes liées.

Code de l'entité Zone simplifiée

class Zone
{
    public function __construct()
    {
        $this->enceintes = new ArrayCollection();
    }

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Enceinte", mappedBy="zone")
     * @ORM\JoinColumn(nullable=true)
     */
    protected $enceintes;

Et pour l'entité Enceinte :

class Enceinte
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Zone", inversedBy="enceintes")
     * @ORM\JoinColumn(nullable=false)
     */
    private $zone;

J'essaie depuis un controller d'effectuer le code suivant juste pour tester les variables :

...
$em = $this->getDoctrine()->getManager();

$zone = $em->getRepository('MonBundle:Zone')->find(2);
var_dump($zone);
die();
...

et je tombe sur l'erreur :

[b]OutOfMemoryException: Error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 492797952 bytes)[/b]

En essayant de débugger, j'ai retirer la liaison onetomany entre la zone et l'enceinte et là il m'affiche bien la zone en question !!!
Donc j'ai remis le lien et cela replante à nouveau... J'ai donc tester les codes suivants :

$em = $this->getDoctrine()->getManager();

$zone = $em->getRepository('MonBundle:Zone')->find(2);
var_dump($zone.getId());
die();
...

Il m'affiche bien l'Id de la zone.

$em = $this->getDoctrine()->getManager();

$zone = $em->getRepository('MonBundle:Zone')->find(2);
var_dump($zone.getEnceintes());
die();
...

Et là je retombe sur l'erreur.
J'ai l'impression qu'il a du mal à gérer les ArrayCollection...
Avez-vous des pistes pour me débloquer ?

Par avance merci.

2 réponses


tu n'as pas déclaré le namespace dans le targetEntity="Namespace\Entity", de plus,
si tu comptes récupérer les enceintes liées à la zone,
il te faudra passer par le repository de l'entité Zone car le find() n'a récupéré que la zone et pas les enceintes associées.
Ce que tu dois faire, c'est de créer une méthode dans le repository de Zone où tu y feras une jointure entre la zone et les enceintes, que tu appelleras par la suite dans le controlleur.

// ZoneRepository.php
public function getZoneAvecEnceintes($id)
{
        $qb = $this->createQueryBuilder('z')
                   ->leftJoin('z.enceintes', 'e')
                   ->addSelect('e')
                   ->where('z.id = :id')
                    ->setParameter('id', $id);

        return $qb->getQuery()
                  ->getResult();
    }
GRM
Auteur

Merci. Je vais tester avec le "targetEntity="Namespace\Entity""