Symfony 使用querybuilder在语言领域优先加入
我正在使用以下查询:Symfony 使用querybuilder在语言领域优先加入,symfony,join,doctrine,left-join,query-builder,Symfony,Join,Doctrine,Left Join,Query Builder,我正在使用以下查询: use Doctrine\ORM\Query\Expr\Join; $query = $this->createQueryBuilder('ad') ->select('ad.id, ad.title, ad.year, ad.hours, ad.status') ->addSelect('rem.remark') ->leftJoin('ad.remark', 'rem', Join::WITH, "rem.languag
use Doctrine\ORM\Query\Expr\Join;
$query = $this->createQueryBuilder('ad')
->select('ad.id, ad.title, ad.year, ad.hours, ad.status')
->addSelect('rem.remark')
->leftJoin('ad.remark', 'rem', Join::WITH, "rem.language = 'NL'")
->getQuery()
->getResult();
此查询工作正常,返回荷兰语广告的备注。这则广告与其评论有一对多的关系
只有我也有一些广告,比如说英语评论,而不是荷兰语评论。我想得到的是那一条的英文注释,而在列表中的其他注释中,仍然是荷兰语注释。因此,也总结一下如何对返回的语言进行优先级列表?解决此问题的一种方法是使用额外的:
$query = $this->createQueryBuilder('ad')
->select('ad.id, ad.title, ad.year, ad.hours, ad.status')
->addSelect('rem.remark')
->leftJoin('ad.remark', 'rem', Join::WITH, "rem.language = 'NL' OR rem.language = 'EN'")
->leftJoin(Remark::class, 'customRem', Join::WITH,
"rem.id <> customRem.id
AND rem.ad = customRem.ad
AND customRem.language = 'NL'")
->where('customRem.id IS NULL')
->getQuery()
->getResult();
对于多种语言,假设有“自定义的”“能力来订购语言,您可以使用:
"rem.id <> customRem.id
AND rem.ad = customRem.ad AND
(case when rem.language = 'NL' THEN 3 " .
"when rem.language = 'EN' THEN 2 " .
"when rem.language = 'DE' THEN 1 ELSE 0 END) < (case when customRem.language = 'NL' THEN 3 " .
"when customRem.language = 'EN' THEN 2 " .
"when customRem.language = 'DE' THEN 1 ELSE 0 END)"
“rem.id customRem.id
和rem.ad=customRem.ad和
(rem.language='NL'然后是3”时的情况)。
“当rem.language='EN'时,则为2”。
“当rem.language='DE'时,则1,否则0结束)<(当customRem.language='NL'时,则为3”。
“当customRem.language='EN'然后是2”时。
“当customRem.language='DE'时,则为1,否则为0结束)”
或者,您可以创建“lang_position”表(id、语言、位置)并连接两次以从语言中获取位置 解决这个问题的一种方法是使用额外的:
$query = $this->createQueryBuilder('ad')
->select('ad.id, ad.title, ad.year, ad.hours, ad.status')
->addSelect('rem.remark')
->leftJoin('ad.remark', 'rem', Join::WITH, "rem.language = 'NL' OR rem.language = 'EN'")
->leftJoin(Remark::class, 'customRem', Join::WITH,
"rem.id <> customRem.id
AND rem.ad = customRem.ad
AND customRem.language = 'NL'")
->where('customRem.id IS NULL')
->getQuery()
->getResult();
对于多种语言,假设有“自定义的”“能力来订购语言,您可以使用:
"rem.id <> customRem.id
AND rem.ad = customRem.ad AND
(case when rem.language = 'NL' THEN 3 " .
"when rem.language = 'EN' THEN 2 " .
"when rem.language = 'DE' THEN 1 ELSE 0 END) < (case when customRem.language = 'NL' THEN 3 " .
"when customRem.language = 'EN' THEN 2 " .
"when customRem.language = 'DE' THEN 1 ELSE 0 END)"
“rem.id customRem.id
和rem.ad=customRem.ad和
(rem.language='NL'然后是3”时的情况)。
“当rem.language='EN'时,则为2”。
“当rem.language='DE'时,则1,否则0结束)<(当customRem.language='NL'时,则为3”。
“当customRem.language='EN'然后是2”时。
“当customRem.language='DE'时,则为1,否则为0结束)”
或者,您可以创建“lang_position”表(id、语言、位置)并连接两次以从语言中获取位置 谢谢你的回答,基本上它是有效的。只有一件事是不正确的工作,你不可能知道这一点,因为我没有解释它的属性。我们有3种语言,DE也是。所以我把你的代码改为:rem.language='NL'或rem.language='EN'或rem.language='DE'。只有当我们有一个没有NL但有EN和DE的广告时,我们才能得到两倍于这两种可选语言的添加。我们可以在join或其他解决方案上使用最大值1吗?@Tom在这种情况下,因为DE>EN>NL,您可以执行:
->leftJoin(备注::class,'customRem',join::WITH,“rem.id customRem.id and rem.ad=customRem.ad and rem.language
,我将尝试更新答案,并提供一个更通用的解决方案,以便能够按需选择。谢谢Jannes,它非常有效。小字体,线程需要在广告中改变。感谢您的好答案,基本上它的工作。只有一件事是不正确的工作,你不可能知道这一点,因为我没有解释它的属性。我们有3种语言,DE也是。所以我把你的代码改为:rem.language='NL'或rem.language='EN'或rem.language='DE'。只有当我们有一个没有NL但有EN和DE的广告时,我们才能得到两倍于这两种可选语言的添加。我们可以在join或其他解决方案上使用最大值1吗?@Tom在这种情况下,因为DE>EN>NL,您可以执行:->leftJoin(备注::class,'customRem',join::WITH,“rem.id customRem.id and rem.ad=customRem.ad and rem.language
,我将尝试更新答案,并提供一个更通用的解决方案,以便能够按需选择。谢谢Jannes,它非常有效。小字体,线程需要在广告中更改。