Bonjour,

J'ai 3 entités, User, Sale, et FavSale. Avec comme relations, dans l'entité User : $attr ( OneToMany=FavSale )
dans Sale : $attr ( OneToMany=FavSale ), et dans FavSale : $user( ManyToOne=User) et $sale (ManyToOne=Sale).

Le problème est que quand je dump un utilisateur dans twig je vois l'attribut qui est censé être une collection, vide. Alors qu'il ne devrait pas.
Je souhaiterai pouvoir faire marcher un système de sauvegarde des favoris avec ce système.

En vous remerciant, je laisse le code concernant ces entités en dessous pour plus clarté pour ceux qui le souhaite. ('jai le même soucis avec les lots que j'aimerai voir s'afficher dans le dump d'un 'sale')

<?php

namespace UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="UserBundle\Repository\UserRepository")
 */
class User extends BaseUser
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * 
     * @ORM\OneToMany(targetEntity="CoreBundle\Entity\FavSale", mappedBy="user", cascade={"persist"})
     */
    protected $userFavorites;

    public function __construct()
    {
        parent::__construct();
        $this->userFavorites = new ArrayCollection();
    } 

    /**
     * Add userFavorite
     *
     * @param \CoreBundle\Entity\FavSale $userFavorite
     *
     * @return User
     */
    public function addUserFavorite(\CoreBundle\Entity\FavSale $userFavorite)
    {
        $this->userFavorites[] = $userFavorite;
        $userFavorite->setUser($this);
        return $this;
    }

    /**
     * Remove userFavorite
     *
     * @param \CoreBundle\Entity\FavSale $userFavorite
     */
    public function removeUserFavorite(\CoreBundle\Entity\FavSale $userFavorite)
    {
        $this->userFavorites->removeElement($userFavorite);
    }

    /**
     * Get userFavorites
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getUserFavorites()
    {
        return $this->userFavorites;
    }
}
<?php

namespace CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use CoreBundle\Entity\lot;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Sale
 *
 * @ORM\Table(name="sale")
 * @ORM\Entity(repositoryClass="CoreBundle\Repository\SaleRepository")
 */
class Sale
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @var bool
     *
     * @ORM\Column(name="live", type="boolean")
     */
    private $live;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_begin", type="datetime")
     */
    private $dateBegin;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_end", type="datetime")
     */
    private $dateEnd;

    /**
     * @var string
     *
     * @ORM\Column(name="city", type="string", length=255)
     */
    private $city;

    /**
     * @var ArrayCollection<CoreBundle\Entity\Lot> $lots
     *
     * @OneToMany(targetEntity="CoreBundle\Entity\lot", mappedBy="sale", cascade={"persist", "remove"})
     */
    private $lots;

    /**
     * 
     * @ORM\OneToMany(targetEntity="CoreBundle\Entity\FavSale", mappedBy="sale", cascade={"persist"})
     */
    private $userFavorites;

    public function __construct()
    {
        $this->lots = new ArrayCollection();
        $this->userFavorites = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    ///////////////////LA LISTE DES GETTERS::SETTERS

    /**
     * Add lot
     *
     * @param \CoreBundle\Entity\Lot $lot
     *
     * @return Sale
     */
    public function addLot(\CoreBundle\Entity\Lot $lot)
    {
        $this->lots[] = $lot;
        $lot->setSale($this);

        return $this;
    }

    /**
     * Remove lot
     *
     * @param \CoreBundle\Entity\Lot $lot
     */
    public function removeLot(\CoreBundle\Entity\Lot $lot)
    {
        $this->lots->removeElement($lot);
    }

    /**
     * Get lots
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getLots()
    {
        return $this->lots;
    }

    /**
     * Add userFavorite
     *
     * @param \CoreBundle\Entity\FavSale $userFavorite
     *
     * @return Sale
     */
    public function addUserFavorite(\CoreBundle\Entity\FavSale $userFavorite)
    {
        $this->userFavorites[] = $userFavorite;
        $userFavorite->setSale($this);
        return $this;
    }

    /**
     * Remove userFavorite
     *
     * @param \CoreBundle\Entity\FavSale $userFavorite
     */
    public function removeUserFavorite(\CoreBundle\Entity\FavSale $userFavorite)
    {
        $this->userFavorites->removeElement($userFavorite);
    }

    /**
     * Get userFavorites
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getUserFavorites()
    {
        return $this->userFavorites;
    }
}
<?php

namespace CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * FavSale
 *
 * @ORM\Table(name="fav_sale")
 * @ORM\Entity(repositoryClass="CoreBundle\Repository\FavSaleRepository")
 */
class FavSale
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="userFavorites")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="CoreBundle\Entity\Sale", inversedBy="userFavorites")
     * @ORM\JoinColumn(name="sale_id", referencedColumnName="id")
     */
    private $sale;

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set user
     *
     * @param \UserBundle\Entity\User $user
     *
     * @return FavSale
     */
    public function setUser(\UserBundle\Entity\User $user = null)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \UserBundle\Entity\User
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set sale
     *
     * @param \CoreBundle\Entity\Sale $sale
     *
     * @return FavSale
     */
    public function setSale(\CoreBundle\Entity\Sale $sale = null)
    {
        $this->sale = $sale;

        return $this;
    }

    /**
     * Get sale
     *
     * @return \CoreBundle\Entity\Sale
     */
    public function getSale()
    {
        return $this->sale;
    }
}

2 réponses


devandclick
Réponse acceptée

Salut, elles ne sont pas vide, pour voir les résultats dans le dump tu dois passer par ton repository et faire un join.
Tu peux le vérifier si tu fais un $entity->getLots()->toArray() tu vas avoir ta collection, seulement doctrine va faire x sous requêtes pour les lister.
A+

Frank Drebin
Auteur
Réponse acceptée

Merci pour ta réponse devandclick. j'ai réussi à pallier à ce problème en rajoutant dans mes annotations fetch="EAGER"