Currently this function works : it displays for a specific game, how many jobs there are.
The problem : If there is no job, the game does not appear on the list.
How to display the game even if there is no job attached ?
Thanks
public function getWithGames()
{
$q = $this->createQuery('c')
->leftJoin('c.stJob j')
->where('j.expires_at > ?', date('Y-m-d h:i:s', time()))
->addOrderBy('c.name');
$q->andWhere('j.is_activated = ?', 1);
$q->andWhere('j.is_public = ?', 1);
return $q->execute();
}
Your conditions should be part of the LEFT JOIN ... ON clause.
Putting conditions in the
ON
clause (as opposed to theWHERE
) indicates that they apply specifically to theJOIN
. If no rows satisfy those conditions, there is no join — and that's just what you want in this case. Putting them in theWHERE
indicates that the result rows must satisfy those conditions. And obviously if there was no join, you can't satisfy any conditions about thej
table.if there is no job its is_activated and is_public field cant be 1. it will be null so you need something like:
where (j.is_activated = 1 and j.is_activated = 1) or (j.is_activated = IS NULL and j.is_activated IS NULL)
...i am not familiar with what librar you are using to construct this query but i guess it could work like this:
this is not pretty... but as i said i dont know your library. you could probably pass an array of arguments or do something like "orWhere...." blabla...
the way it is done is also clumsy and could be done better. use the conditions directly to establish the join! that way you avoid ahving the whole tables combined and afterwards filtered...