Php 原则2通过一对一相同关系与表格的差异
我有两个实体具有相同的一对一关系:Php 原则2通过一对一相同关系与表格的差异,php,doctrine-orm,orm,Php,Doctrine Orm,Orm,我有两个实体具有相同的一对一关系: class FirstEntity { ... /** * @var \App\Entity\ThirdEntity * * @ORM\OneToOne(targetEntity="App\Entity\ThirdEntity") */ protected $thirdEntity; class SecondEntity { ... /** * @var \App\Entity\ThirdEntity * * @
class FirstEntity {
...
/**
* @var \App\Entity\ThirdEntity
*
* @ORM\OneToOne(targetEntity="App\Entity\ThirdEntity")
*/
protected $thirdEntity;
class SecondEntity {
...
/**
* @var \App\Entity\ThirdEntity
*
* @ORM\OneToOne(targetEntity="App\Entity\ThirdEntity")
*/
protected $thirdEntity;
$thirdEntity
字段不能为空。
是否有任何方法可以通过查询生成器或本机查询返回结果,如数组\u diff()操作:
$firsts = array_map(function (FirstEntity $firstEntity) {
return $firstEntity->getThirdEntity()->getId();
}, $this->em->getRepository(FirstEntity::class)->findAll());
$seconds = array_map(function (SecondEntity $secondEntity) {
return $secondEntity->getThirdEntity()->getId();
}, $this->em->getRepository(SecondEntity::class)->findAll());
return array_diff($firsts, $seconds);
因此,我想要的是一个所有
ThirdEntity
的列表,它链接到FirstEntity
,而不是SecondEntity
,最有效的方法是使用本机查询或查询生成器(或多个本机查询/查询构建器)。这样,数据库将为您完成所有过滤,这意味着条令不需要做很多工作
查询生成器是最简单的方法,但确实需要您也从ThirdEntity
映射到FirstEntity
和SecondEntity
——下面的代码假设您已经建立了映射
$qb = $em->createQueryBuilder();
$result = $qb->select('t')->from('ThirdEntity', 't')
->innerJoin('t.firstEntity', 'f')
->leftJoin('t.secondEntity', 's')
->where($qb->expr()->isNull('s.id'));
->getQuery()->getResult();
这里发生的事情是,我们要求数据库获取所有ThirdEntity
记录,将它们与所有FirstEntity
记录进行内部连接(因此不包含FirstEntity
的ThirdEntity
)。然后我们将与SecondEntity
左连接,这意味着如果ThirdEntity
也链接到SecondEntity
上,则其数据可用于过滤,否则我们将为所有SecondEntity
列获取NULL
。最后一步是仅选择那些不存在SecondEntity
(表示其ID为null
)的记录
取决于确切的数据集,这种“一次查询”方法可能无法提供最佳性能。首先选择与FirstEntity
相关的所有ThirdEntity
项目的ID,然后(在单独的查询中,使用该ID列表作为参数)筛选出与SecondEntity
相关的项目,可能会更快。反过来做这两件事可能会更快。不过,我并不期望这样,所以我们将把它留给另一个问题(或这个问题的另一个答案)。那么您想要的是一个所有第三十身份的列表,它链接到第一个实体
,而不是第二个实体
?是的,这正是我需要的,可以通过条令查询来实现吗?