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
相关的项目,可能会更快。反过来做这两件事可能会更快。不过,我并不期望这样,所以我们将把它留给另一个问题(或这个问题的另一个答案)。

那么您想要的是一个所有
第三十身份的列表,它链接到
第一个实体
,而不是
第二个实体
?是的,这正是我需要的,可以通过条令查询来实现吗?