SQL / Doctrine: проблема с левым соединением

В настоящее время эта функция работает: она отображает для конкретной игры, сколько заданий есть.

Проблема : если нет заданий, игра не отображается в списке.

Как отображать игру, даже если нет заданий?

благодаря

public function getWithGames() { $q = $this->createQuery('c') ->leftJoin('c.stJob j') ->where('j.expires_at > ?', date('Ymd h:i:s', time())) ->addOrderBy('c.name'); $q->andWhere('j.is_activated = ?', 1); $q->andWhere('j.is_public = ?', 1); return $q->execute(); } 

Ваши условия должны быть частью предложения LEFT JOIN … ON.

 $q = $this->createQuery('c') ->leftJoin('c.stJob j WITH j.expires_at > ? AND j.is_activated = 1 AND j.is_public = 1', date('Ymd h:i:s', time())) ->addOrderBy('c.name'); 

Постановка условий в предложение ON (в отличие от WHERE ) указывает на то, что они применяются конкретно к JOIN . Если никакие строки не удовлетворяют этим условиям, соединение отсутствует – и это именно то, что вы хотите в этом случае. Ввод их в WHERE указывает на то, что строки результатов должны удовлетворять этим условиям. И, очевидно, если бы не было соединения, вы не можете удовлетворить любые условия в таблице j .

 $q->andWhere('j.is_activated = ?', 1); $q->andWhere('j.is_public = ?', 1); 

если нет работы, его is_activated и is_public поле не может быть 1. это будет null, так что вам нужно что-то вроде: where (j.is_activated = 1 and j.is_activated = 1) or (j.is_activated = IS NULL and j.is_activated IS NULL)

я не знаком с тем, что библиотекарь вы используете для построения этого запроса, но я думаю, он мог бы работать следующим образом:

 public function getWithGames() { $q = $this->createQuery('c') ->leftJoin('c.stJob j') ->where('j.expires_at > ?', date('Ymd h:i:s', time())) ->addOrderBy('c.name'); $q->andWhere('(j.is_activated = ? AND j.is_public = 1) OR (j.is_activated IS NULL AND j.is_publicIS NULL )', 1); return $q->execute(); } 

это не очень … но, как я уже сказал, я не знаю вашу библиотеку. вы могли бы передать массив аргументов или сделать что-то вроде «orWhere ….» blabla …

то, как это делается, также неудобно и может быть сделано лучше. используйте условия для установления соединения! таким образом, вы избегаете образования целой таблицы, а затем фильтруются …