我有两个表:文章和类别。文章可以分配一个单独的类别。但他们不必有一个类别。

架构:

Article:
  columns:
    title:
      type: string(255)
    content:
      type: string(255)
    category_id:
      type: integer(4)

Category:
  columns:
    name:
      type: string(255)
    article_id:
      type: integer(4)
  relations:
    Article:
      class: Article
      local: article_id
      foreign: id
      foreignAlias: ArticleCategories

我可以查询所有已分配类别的文章,如下所示:
$articles= Doctrine_Query::create()
  ->from('Article a')
  ->leftJoin('a.Category c ON c.article_id = a.id')
  ->where('c.id > 0')
  ->execute();

它返回这个:
Object->Array
(
  [0] => Array
  (
    [id] => string(1) "1"
    [title] => string(4) "test"
    [content] => string(4) "test"
    [Category] => Array
    (
      [0] => Array
      (
        [id] => string(1) "2"
        [name] => string(7) "testing"
      )
    )
  )
etc...

我需要做的是查询没有类别关系的文章。我也不能只说 ->where('c.id = NULL'),因为如果没有 Category 关系,那么对象中就不会返回任何 [Category] 数组。它只返回 id, title and content 。另外我不能说 ->where(a.Category = NULL) 因为 Category 不是文章的列。

有任何想法吗?

更新
我在架构上犯了一个错误并更新了它。我知道一个类别只与一篇文章有​​关系并没有真正意义,但实际上我没有使用文章/类别。我只是将这些术语用作示例。

最佳答案

更新 :

因此,如果您希望文章作为主要对象,最简单的方法是使用 fk 为 null 的条件执行 leftJoin LEFT JOIN s 总是抓取 join 左侧的记录,而不管 join 右侧是否有对应的记录。因此,如果没有您基本上可以获得所有文章的结果。因此,我们可以使用 where 条件过滤那些没有类别的文章......与之前非常相似:

$articles = Doctrine_Query::create()
  ->from('Article a')
  ->leftJoin('a.Category c')
  ->where('c.article_id IS NULL')
  ->execute();

没有理由指定 on 条件。 Doctrine 将根据实际情况解决这个问题。此外,您不需要使用 where 进行这种类型的过滤,而是使用内连接,内连接只会选择关系存在的项目(即有 a.category_id = c.id ),因此您发布的查询实际上应该是:
$articles = Doctrine_Query::create()
  ->from('Article a')
  ->innerJoin('a.Category c')
  ->execute();

要获取没有任何类别的文章,您可以在 category_id 上查找 null 的 article :
$articles= Doctrine_Query::create()
  ->from('Article a')
  ->leftJoin('a.Category c')
  ->where('a.category_id IS NULL')
  ->execute();

我可能会删除连接,因为它并不是真正必要的,除非您出于某种原因需要结果中的空列。

关于php - Doctrine:只查询不存在关系的地方?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7030480/

10-15 11:27