Php 条令实体管理器通过空数组集合查找
我有一个名为Cycle的实体,与CycleActeur有一个OneToMany关联(见下面的代码) 我希望能够从我的控制器中使用一个简单的doctrine findBy*方法获取数据库中的所有Cycle对象,而不关联CycleActeur对象 也就是说: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
$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的任何地方使用此代码
来源: 道歉,扭转局面。删除我的答案以避免混淆。:-)