Symfony 条令从一中选择多(多对一单向(不同捆绑))
在一个限制可用选项的遗留项目上工作,让我陷入了一个需要解决以下问题的境地,最好是用条令 我有两个不同捆绑包中的实体,它们具有单向多对一链接 BundleA依赖BundleB,实体的链接与此类似: BundleA/Entity/TheMany:Symfony 条令从一中选择多(多对一单向(不同捆绑)),symfony,doctrine-orm,dql,many-to-one,Symfony,Doctrine Orm,Dql,Many To One,在一个限制可用选项的遗留项目上工作,让我陷入了一个需要解决以下问题的境地,最好是用条令 我有两个不同捆绑包中的实体,它们具有单向多对一链接 BundleA依赖BundleB,实体的链接与此类似: BundleA/Entity/TheMany: /** * @var TheOne $theOne * @ORM\ManyToOne(targetEntity="BundleB\Entity\TheOne") * @ORM\JoinColumn(name="theone_id", referenc
/**
* @var TheOne $theOne
* @ORM\ManyToOne(targetEntity="BundleB\Entity\TheOne")
* @ORM\JoinColumn(name="theone_id", referencedColumnName="id", onDelete="SET NULL")
*
*/
private $theOne;
从BundleB中,我现在需要选择所有的一个实体,对于每个实体,我需要所有的多个实体
查询还需要对一个实体的任何属性进行排序,或者对多个实体的相关属性计数进行排序
这是相当简单的原则,以建立一个查询,带回所有的一个实体和其中一个为每个实体。。。然而,我在提出一个条令查询时遇到了一些困难,该查询将返回所有相关的多个实体,而不仅仅是一个实体
我希望有人可能遇到过类似的问题,因此有一些见解
这可能解释得不够清楚,在这种情况下,请指示我进一步解释。因此,您要做的是获取所有的一,并为每一个找到所有的多。但是您想将所有多个元素放在一个数组中,还是想为实体创建一个数组?(我在这里做了什么)
最后,我通过使用GROUP_CONCAT(需要包含的)实现了我所需要的 查询如下所示:
$queryBuilder->select(
'to,
GROUP_CONCAT(DISTINCT tm.id SEPARATOR \',\') as theManyIds,
COUNT(DISTINCT tm.id) as HIDDEN theManyCount'
)
->from('BundleB\Entity\TheOne', 'to')
->leftJoin(
'BundleA\Entity\TheMany',
'tm',
Join::WITH,
'to.id = tm.theOne'
)
->groupBy('to.id')
->orderBy($sortString, $direction)
->setFirstResult($start)
->setMaxResults($limit);
我接受了链接两个bundle的后果,这是一个折衷方案——不过,使用本机SQL和结果集映射()可以避免这种情况。类似的情况,但是这种方法有两个问题,第一个问题是我需要按“TheMany”的数量对一个bundle的列表进行排序与任何给定实体关联的实体。另一个问题是BundleA没有BundleB的可见性。我不能介绍这个链接,因为它是一个循环依赖项。BundleA需要BundleB,但BundleB不需要BundleA(由于composer之类的循环依赖性问题,我无法将其作为需求添加)。事实上,这两个bundle是相互依赖的,应该合并,但出于各种原因,我不能这样做。另一点是,对于这个任务来说,如果我得到了许多实体的实际数据,这并不重要,实际上我只需要一个逗号分隔的ID列表。我觉得我可能不得不求助于SQL而不是DQL。好的,首先,如果我得到了你的要求,我会更改代码,这样你就可以得到一个按链接数量排列的订单列表,但我不明白为什么BundleB不应该被识别。如果您只是添加
使用Path\of\BundleB代码>这应该行得通。BundleB不能作为BundleA的要求,因为BundleB已经是BundleA的要求。我不能引入循环依赖,而且在这两个bundle之间添加耦合是一种不好的做法(尽管如前所述,它们应该是同一个bundle)。在应用程序中,这不是问题,因为两个捆绑包在实践中总是存在的,但是对于自动化测试,每个捆绑包必须能够作为独立的捆绑包(加上任何依赖项)通过其全套测试。
$queryBuilder->select(
'to,
GROUP_CONCAT(DISTINCT tm.id SEPARATOR \',\') as theManyIds,
COUNT(DISTINCT tm.id) as HIDDEN theManyCount'
)
->from('BundleB\Entity\TheOne', 'to')
->leftJoin(
'BundleA\Entity\TheMany',
'tm',
Join::WITH,
'to.id = tm.theOne'
)
->groupBy('to.id')
->orderBy($sortString, $direction)
->setFirstResult($start)
->setMaxResults($limit);