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;
}
3
Turquoise 16 nov. 2017 à 15:42

4 réponses

Meilleure réponse

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;
    }
}
3
Snegirekk 16 nov. 2017 à 18:18

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.

0
Alexander Yakutskiy 29 janv. 2020 à 17:24
$cyclesWithNoCycleActeur = $cycleManager->findBy(array('SIZE(acteurs)' => 0));

Mes 2 cents

0
J. Scott Elblein 19 sept. 2019 à 18:58

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.

0
Jakub Matczak 17 nov. 2017 à 15:28
47329953