我有一个名为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;
}
答案 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。