J'ai une entité appelée Cycle, avec une association OneToMany à CycleActeur (voir code ci-dessous).
J'aimerais pouvoir récupérer tous les objets Cycle dans la base de données sans aucun objet CycleActeur associé, en utilisant une méthode simple doctrine findBy * de mon contrôleur.
C'est-à-dire quelque chose comme ça:
$manager = $this->getContainer()->get('doctrine.orm.entity_manager');
$cycleManager = $manager->getRepository('ESI67Zen2Bundle:Cycle');
$cyclesWithNoCycleActeur = $cycleManager->findBy('acteurs', null);
Existe-t-il un moyen de le faire sans avoir à écrire une méthode spécifique dans le CycleRepository?
Extrait du code de classe Cycle
class Cycle {
/**
* @ORM\OneToMany(
* targetEntity="CycleActeur",
* mappedBy="cycle",
* orphanRemoval=true)
*/
private $acteurs;
}
Extrait du code de classe Cycle
class CycleActeur {
/**
* @var Cycle Le cycle concerné
*
* @ORM\ManyToOne(targetEntity="Cycle", inversedBy="acteurs")
* @ORM\JoinColumn(name="cycle_id", referencedColumnName="id")
*
*/
private $cycle;
}
4 réponses
Votre entité Cycle est le côté inverse de la relation et sa table dans la base de données n'a pas de colonne "acteurs", vous ne pouvez donc pas utiliser findBy(['acteurs'=>null])
ou findByActeurs(null)
. Mais vous pouvez quand même faire quelque chose:
$manager = $this->getContainer()->get('doctrine.orm.entity_manager');
$cycleManager = $manager->getRepository('ESI67Zen2Bundle:Cycle');
$allCycles = $cycleManager->findAll();
$cyclesWithNoCycleActeur = [];
foreach($allCycles as $cycle)
{
if($cycle->getActeurs()->isEmpty())
{
$cyclesWithNoCycleActeur[] = $cycle;
}
}
Dans ce cas (à mon avis), le meilleur moyen est d'utiliser la condition de DQL IS EMPTY
:
$manager
->createQueryBuilder()
->from(Cycle::class, 'cycle')
->select('cycle')
->andWhere('cycle.acteurs IS EMPTY')
->getQuery()
->getResult()
;
Vous pouvez utiliser ce code dans EntityRepository ou partout où vous avez accès à EntityManager.
Source: Documentation de la doctrine.
$cyclesWithNoCycleActeur = $cycleManager->findBy(array('SIZE(acteurs)' => 0));
Mes 2 cents
Il existe une fonction DQL {{ X0}}, qui selon la documentation de Doctrine:
SIZE (collection) - Renvoie le nombre d'éléments dans la collection spécifiée
Vous pouvez donc l'utiliser comme condition comme:
SIZE(acteurs) = 0
Je ne sais pas si cela fonctionnera avec une méthode findBy
, mais je recommanderais de créer une méthode personnalisée dans le référentiel de ESI67Zen2Bundle:Cycle
, pour rendre explicite ce que fait le code. Cela fonctionnera à la fois pour DQL Query et Query Builder.
De nouvelles questions
php
PHP est un langage de script largement utilisé, de haut niveau, dynamique, orienté objet et interprété, principalement conçu pour le développement Web côté serveur. Utilisé pour les questions sur le langage PHP.