Doctrine querybuilder不会返回与leftJoin的一对多关系中的所有记录

问题描述 投票:-1回答:1

我有一个代表广告的广告实体。此广告实体与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记录。

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

Herbie sql转储:

“选择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是null)“

symfony doctrine left-join
1个回答
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();

参考

© www.soinside.com 2019 - 2024. All rights reserved.