Doctrine实体管理器通过空数组集合查找

时间:2017-11-16 12:42:54

标签: php symfony doctrine-orm doctrine query-builder

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

我希望能够使用我的控制器中的一个简单的doctrine findBy *方法,在没有关联CycleActeur对象的情况下获取数据库中的所有Cycle objets。

这就是说:

$manager = $this->getContainer()->get('doctrine.orm.entity_manager');
$cycleManager =  $manager->getRepository('ESI67Zen2Bundle:Cycle');
$cyclesWithNoCycleActeur = $cycleManager->findBy('acteurs', null);

有没有办法在不需要在CycleRepository中编写特定方法的情况下执行此操作?

从Cycle类代码中提取

class Cycle {
  /**
   * @ORM\OneToMany(
   *      targetEntity="CycleActeur", 
   *      mappedBy="cycle", 
   *      orphanRemoval=true)
   */
  private $acteurs;
}

从Cycle类代码中提取

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

4 个答案:

答案 0 :(得分:2)

您的周期实体是关系的反面,它在数据库中的表没有'acteurs'列,因此您无法使用findBy(['acteurs'=>null])findByActeurs(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;
    }
}

答案 1 :(得分:0)

根据Doctrine文档,有一个DQL函数SIZE()

  

SIZE(collection) - 返回指定集合中的元素数量

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

SIZE(acteurs) = 0

我不确定它是否适用于findBy方法,但我建议在ESI67Zen2Bundle:Cycle的存储库中创建自定义方法,以明确说明代码正在做。它将适用于DQL查询和查询生成器。

答案 2 :(得分:0)

$cyclesWithNoCycleActeur = $cycleManager->findBy(array('SIZE(acteurs)' => 0));

我的2美分

答案 3 :(得分:0)

在这种情况下(我认为),最好的方法是使用DQL的条件IS EMPTY

  $manager
    ->createQueryBuilder()
    ->from(Cycle::class, 'cycle')
    ->select('cycle')
    ->andWhere('cycle.acteurs IS EMPTY')
    ->getQuery()
    ->getResult()
    ;

您可以在EntityRepository或有权访问EntityManager的任何地方使用此代码。

资料来源:Doctrine documentation