Построитель запросов Doctrine возвращает не все записи в отношении один ко многим с leftJoin - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть рекламный объект, который представляет рекламу.Эта рекламная сущность имеет слишком много связей с 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();

С помощью этого запроса я получаю все объявления, в которых, например, заполнено голландское примечание или нет записей adRemark.Но я скучаю по объявлениям, которые, например, не имеют записи NL adRemaks, но имеют запись EN или DE.

Я работаю это часами, но не могу определить хороший запрос.Помощь действительно приветствуется.

Herby the sql dump:

"SELECT ad.id, ad.title, ad.year, ad.hours, ad.status, rem.remarkОТ Mtr \ Bundle \ Entity \ Ad ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к ad.remark rem WHERE (rem.language = 'NL' или rem.language имеет значение null) "

1 Ответ

0 голосов
/ 09 апреля 2019

Вы не хотите фильтровать весь набор результатов, но только при соединении , поэтому переместите условие в условие объединения .

Измените запросна:

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();

Ссылки

...