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?0 votes
Je viens juste d'ajouter cela à @delboy1978uk
0 votes
Pour clarifier, obtenez-vous des valeurs nulles pour l'entité
Site Web
ou les entités imbriquéesHôte
etPage
?1 votes
Doctrine, par défaut, ne récupère que les propriétés non collection d'une entité. Les collections de l'entité seront dans ce cas une
PersistentCollection
(wrapper) avec une propriété privée nomméeinitialized
/__isInitialized__
et une valeurfalse
, ce qui signifie qu'elle n'a pas encore été récupérée. Pour indiquer à la requête que vous les voulez aussi, vous devez au moins les ajouter auSELECT
, c'est-à-direSELECT w, p [...]
. Je ne suis pas certain si définir le one-to-many àfetch="EAGER"
(lire sur le chargement eager vs lazy) nécessite des choses supplémentaires ......