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,它非常有效。小字体,线程需要在广告中更改。