ОБНОВЛЕНИЕ :
Так что самый простой способ, если вы хотите, чтобы статья была первичным объектом, это сделать leftJoin
с условием, чтобы fk был нулевым.LEFT JOIN
s всегда захватывает запись с левой стороны объединения, независимо от того, имеет ли правая сторона объединения соответствующую запись.Так что без того, где вы по существу получите результат всех статей.Таким образом, мы можем затем отфильтровать те статьи, которые НЕ имеют категорию, используя условие where ... очень похожее на предыдущее:
$articles = Doctrine_Query::create()
->from('Article a')
->leftJoin('a.Category c')
->where('c.article_id IS NULL')
->execute();
Нет никаких оснований для указания условия on
,Доктрина выяснит это на основе реальности.Кроме того, вам не нужно использовать где для этого типа фильтрации используйте внутреннее соединение, вместо этого внутреннее соединение будет выбирать только те итемы, где существует связь (т. Е. Существует a.category_id = c.id
), поэтому запрос, который вы разместили, должен быть на самом деле:
$articles = Doctrine_Query::create()
->from('Article a')
->innerJoin('a.Category c')
->execute();
Чтобы получить статьи без какой-либо категории, вы можете найти нулевой category_id
на article
:
$articles= Doctrine_Query::create()
->from('Article a')
->leftJoin('a.Category c')
->where('a.category_id IS NULL')
->execute();
Идентификатор, вероятно, удалит объединение, потому что это на самом деле не нужноесли вам не нужны пустые столбцы в результате по какой-либо причине.