Php 条令实体管理器通过空数组集合查找

Php 条令实体管理器通过空数组集合查找,php,symfony,doctrine-orm,doctrine,query-builder,Php,Symfony,Doctrine Orm,Doctrine,Query Builder,我有一个名为Cycle的实体,与CycleActeur有一个OneToMany关联(见下面的代码) 我希望能够从我的控制器中使用一个简单的doctrine findBy*方法获取数据库中的所有Cycle对象,而不关联CycleActeur对象 也就是说: $manager = $this->getContainer()->get('doctrine.orm.entity_manager'); $cycleManager = $manager->getRepository('E

我有一个名为Cycle的实体,与CycleActeur有一个OneToMany关联(见下面的代码)

我希望能够从我的控制器中使用一个简单的doctrine findBy*方法获取数据库中的所有Cycle对象,而不关联CycleActeur对象

也就是说:

$manager = $this->getContainer()->get('doctrine.orm.entity_manager');
$cycleManager =  $manager->getRepository('ESI67Zen2Bundle:Cycle');
$cyclesWithNoCycleActeur = $cycleManager->findBy('acteurs', null);
有没有一种方法可以做到这一点,而不必在CycleRepository中编写特定的方法

从循环类代码中提取

class Cycle {
  /**
   * @ORM\OneToMany(
   *      targetEntity="CycleActeur", 
   *      mappedBy="cycle", 
   *      orphanRemoval=true)
   */
  private $acteurs;
}
class CycleActeur {
 /**
  * @var Cycle Le cycle concerné
  * 
  * @ORM\ManyToOne(targetEntity="Cycle", inversedBy="acteurs")
  * @ORM\JoinColumn(name="cycle_id", referencedColumnName="id")
  * 
  */
  private $cycle;
}
从循环类代码中提取

class Cycle {
  /**
   * @ORM\OneToMany(
   *      targetEntity="CycleActeur", 
   *      mappedBy="cycle", 
   *      orphanRemoval=true)
   */
  private $acteurs;
}
class CycleActeur {
 /**
  * @var Cycle Le cycle concerné
  * 
  * @ORM\ManyToOne(targetEntity="Cycle", inversedBy="acteurs")
  * @ORM\JoinColumn(name="cycle_id", referencedColumnName="id")
  * 
  */
  private $cycle;
}

您的Cycle实体是关系的反面,并且它在数据库中的表没有'actuers'列,因此您不能使用
findBy(['actuers'=>null])
findbyactuers(null)
。但你还是可以做点什么:

$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;
    }
}
有一个DQL函数,根据条令文档:

大小(集合)-返回指定集合中的元素数

因此,您可以将其用作条件,如:

SIZE(acteurs) = 0
我不确定它是否能与
findBy
方法一起工作,但我建议在
ESI67Zen2Bundle:Cycle
的存储库中创建一个自定义方法,以明确代码的作用。它将同时适用于DQL查询和查询生成器

$cyclesWithNoCycleActeur = $cycleManager->findBy(array('SIZE(acteurs)' => 0));
我的2美分在这种情况下(在我看来)最好的方法是使用DQL的条件
为空

  $manager
    ->createQueryBuilder()
    ->from(Cycle::class, 'cycle')
    ->select('cycle')
    ->andWhere('cycle.acteurs IS EMPTY')
    ->getQuery()
    ->getResult()
    ;
您可以在EntityRepository中或您有权访问EntityManager的任何地方使用此代码


来源:

道歉,扭转局面。删除我的答案以避免混淆。:-)