教义querybuilder并非以leftJoin

时间:2019-04-08 14:25:19

标签: symfony doctrine left-join

我有一个代表广告的广告实体。此广告实体与adRemark的关系过多。这样做的原因是adRemark由于支持多种语言而包含多个记录。

一种广告只能在一种语言中使用一个adRemark,但会误记未填写的语言的记录,或者甚至由于没有语言数据而可能没有adRemark记录。

我正在建立一个查询,以检索包括adRemark在内的所有广告。

       $query = $this->createQueryBuilder('ad')
            ->select('ad.id, ad.title, ad.year, ad.hours, ad.status')
            ->addSelect('rem.remark')
            ->leftJoin('ad.remark', 'rem')    
            ->andWhere("rem.language = 'NL' or rem.language is null")
            ->getQuery()
            ->getResult();

通过此查询,我将获得所有带有例如荷兰语(NL)备注或没有adRemark记录的广告。但是我想念没有NL adRemaks记录但有EN或DE记录的广告。

我为此工作了几个小时,但无法定义一个好的查询。非常感谢您的帮助。

Herby sql dump:

  

“选择ad.id,ad.title,ad.year,ad.hours,ad.status,rem.remark FROM   Mtr \ Bundle \ Entity \ Ad LEFT JOIN ad.remark rem WHERE(rem.language ='NL'或rem.language为空)“

1 个答案:

答案 0 :(得分:0)

您不想过滤所有结果集,而仅对联接进行过滤,因此将条件移至 join子句

将查询更改为:

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' OR rem.language is null")
        ->getQuery()
        ->getResult();

参考