【问题标题】:Laravel ORM "with" is returning all rows even with constraintLaravel ORM“with”即使有约束也返回所有行
【发布时间】:2013-08-19 14:57:32
【问题描述】:

使用 Laravel 4 Eloquent ORM,知道为什么以下内容会拉动每一行,而不仅仅是我要求的那一行 (book_id=3)?

    if ($Book = Book::find(3)) {
        return (Book::with(array('chapters.pages' => function($query)
                    {
                        $query->where('book_id', '=', 3 ); // hard-coded id for illustration purposes
                    })
            )->get()->toJson());
    }

我得到的输出是每一本书的每一章每一页。我只想拉出那本书的章节和页面。

根据documentation 我应该可以添加一个约束。好像我非常密切地关注文档。提前致谢。

【问题讨论】:

  • 应该 "return ($Book::with(..." 是 "return (Book::with(..."? 即没有 $
  • 它上面的行将一个 ORM 对象分配给变量 $Book,但我实际上也可以使用 Book::with(...)。刚试了一下,结果一样。我会更新问题。
  • 你能发布一些你的章节模型,以及书籍、章节和页面的架构吗?

标签: php orm laravel laravel-4


【解决方案1】:

我认为问题在于您要求Book::with() - 但您没有对 Book() 本身施加限制。所以你需要做Book::with()->where()

这个有用吗

Book::with(array('chapters.pages' => function($query)
                    {
                        $query->where('book_id', '=', 3 ); // hard-coded id for illustration purposes
                    })
            )->where('id', '=', '3')->get()->toJson());

注意 ->where() - 将 id 约束放在查询上。

编辑:如果您有正确定义的关系(例如 HasMany() 等) - 那么这应该有效:

$books = Book::with('chapters.pages')->where('id', '=', '3')->get();

因为与 mean 的关系,它只获取定义为 3 的书的“章节/页”。

【讨论】:

  • 好吧,我会被诅咒的,它成功了!不知道我是如何错过 where() 的。有时你只需要第二组眼球。谢谢!
  • 仅供参考,您对更简单的版本是正确的。一旦我添加了 with()->where(),就不需要 $query->where()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多