我有一个代表广告的广告实体。此广告实体与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)“
您不希望过滤所有结果集,而只是过滤连接,因此将条件移动到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();
参考