【问题标题】:doctrine query for chained one-to-many relationships链式一对多关系的学说查询
【发布时间】:2010-08-04 16:04:47
【问题描述】:

我有三个表 A、B、C。A 和 B 具有一对多的关系。 B 和 C 有另一个一对多的关系。换句话说,每个A可以有多个B,而每个B可以有多个C。

现在我想查询 A 的给定记录,以获取所有具有相关 C 的相关 B。换句话说,对于给定的 a,它是表 A 中的一条记录,我想从表 B 中获取所有相关的 B,前提是每个 B 在表 C 中也有多个相关的 C。

PHP原则中的语句如何写?我有一些代码不起作用:

Doctrine_Query::create()->from('B b')->leftJoin('C c') ->andWhere('b.A_id = ?', a.id)->andWhere('c.b_id = b.id');

【问题讨论】:

    标签: php doctrine orm


    【解决方案1】:

    你为什么不直接使用 innerJoin ?

    使用 Foo、Bar 和 Baz(分别为 A、B 和 C):

    Doctrine_Query::create()
    ->from('Bar bar')
    ->where('bar.foo_id = ?', $foo->id)
    ->innerJoin('bar.Baz baz');
    

    这样你只会得到属于 Foo 并且有一个或多个 Baz 的 Bar。

    【讨论】:

      【解决方案2】:

      从我与 Doctrine 的合作来看,这是不可能的(我正在谈论的是 Doctrine 1)。

      我知道很糟糕的解决方法是执行多个查询。 IE 获取所有 B id 并在 whereIN 子句中使用它们,并在单独的查询中将它们提取出来。如果其他人有更好的方法,我会对它感兴趣:)

      【讨论】:

        【解决方案3】:

        正如 premiso 所说,您至少需要编写 2 个查询。我也会按照他建议的方式进行(获取所有 B id 并使用 IN)。

        要使其更符合教义,请查看DQL Subqueries。他们已经展示了一个使用 IN 与选择 ID 相关的示例。

        编辑:阅读 DuoSRX 的回答,我想你可能是指他在 Inner Joins 中展示的内容,但不太确定我是否正确理解了这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多