2 votes

Doctrine & Symfony - Aucune donnée d'hydratation à partir de la requête personnalisée

Bon après-midi,

J'essaie d'obtenir toutes les données avec une seule requête DQL dans un Repository spécifique.

Le problème est que même si j'ai Host & Page[] (collection), la requête retourne des valeurs nulles pour ces entités.

Voici mes entités ([EDIT] après la question de delboy1978uk):

/**
 * @ORM\Entity(repositoryClass="App\Repository\WebsiteRepository")
 */
class Website 
{
    /**
     * @var int|null $id
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string $domainName
     *
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    private $domainName;

    /**
     * @var string $language
     *
     * @ORM\Column(type="string", length=2, nullable=false)
     */
    private $language;

    /**
     * @var Host $host
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Host", cascade={"persist"})
     * @ORM\JoinColumn(name="host_id", referencedColumnName="id", nullable=false)
     */
    private $host;

    /**
     * @var ArrayCollection $pages
     *
     * @ORM\OneToMany(targetEntity="App\Entity\Page", mappedBy="website", cascade={"persist"})
     */
    private $pages;

    /**
     * Website constructor.
     */
    public function __construct()
    {
        $this->pages = new ArrayCollection();
    }
}

/**
 * @ORM\Entity(repositoryClass="App\Repository\HostRepository")
 */
class Host
{
    /**
     * @var int|null $id
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string|null
     * 
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    private $legalName;

    /**
     * @var string|null
     * 
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    private $address;

    /**
     * @var string|null
     *
    * @ORM\Column(type="string", length=15, nullable=false)
    */
    private $phoneNumber;
}

/**
 * @ORM\Entity(repositoryClass="App\Repository\PageRepository")
 */
class Page
{
    /**
     * @var int|null $id
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
    * @var string|null $route
    * 
    * @ORM\Column(type="string", length=255, nullable=false)
    */
    private $route;

    /**
    * @var string|null $template
    *
    * @ORM\Column(type="string", length=255, nullable=false)
    */
    private $template;

    /**
    * @var Website $website
    *
    * @ORM\ManyToOne(targetEntity="App\Entity\Website", inversedBy="pages")
    */
    private $website;
}

C'est ma méthode pour trouver la configuration ([EDIT] après la question de delboy1978uk):

class WebsiteRepository extends ServiceEntityRepository
{
    /**
     * WebsiteRepository constructor.
     *
     * @param ManagerRegistry $registry
     */
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Website::class);
    }

    public function findConfiguration(): array
    {
        return $this->getEntityManager()->createQuery(
            'SELECT w
             FROM App\Entity\Website w
             JOIN w.host h
             LEFT JOIN w.pages p'
        )->getResult();
    }
}

Je m'attends à obtenir les Host & Page[] (collection) de la méthode findConfiguration dans WebsiteRepository.

0 votes

Ne votre dépôt devrait-il pas étendre une classe Doctrine?

0 votes

Je mets à jour la publication @delboy1978uk

1 votes

Ne devriez-vous pas avoir @Entity au-dessus de votre classe? comme @ORM\Entity(repositoryClass="Del\Repository\UserRepository") ou autre chose?

0voto

NBoulfroy Points 50

Merci pour votre aide.

Voici la solution avec la méthode findConfiguration dans WebsiteRepository pour la méthode findConfiguration :

SELECT w, h, p
FROM App\Entity\Website w
LEFT JOIN w.host h
LEFT JOIN w.pages p

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X