【发布时间】:2016-08-01 14:20:42
【问题描述】:
在 laravel 文档中,他们讨论了急切加载相关数据以解决 N+1 查询问题。我想根据这些关系中的数据过滤我的数据,而不必遍历结果(也就是说,我希望在查询时完成)
文档中使用的示例如下:
$books = App\Book::with('author.contacts')->get();
如果我想过滤这些书以仅包含作者居住在邮政编码 12345 中的人,我该怎么做?
以下查询都不适合我:
$books = App\Book::with('author.contacts')->where('zip', 12345)->get();
$books = App\Book::with('author.contacts')->where('author.contacts.zip', 12345)->get();
在 Eloquent 中是否有一种简单的方法可以做到这一点?
【问题讨论】:
-
你应该可以做这样的事情
App\Book::with('author.contacts' => function($q){ $q->where('zip', 12345)})->get(); -
@Andrew 这实际上并没有改变我收藏的书籍数量。如果我使用
toSql转储查询,我最终会得到"select * from books",这表明只过滤急切加载的关系,而不是过滤我想要的查询中的书籍。 -
好吧,那我的错。我实际上已经在我的本地机器上尝试过这个查询,它应该可以正常工作
App\Book::with('author.contacts')->whereHas('author.contacts' => function($q){ $q->where('zip', 12345)})->get();。如果这不能正常工作,我会吃掉我的帽子。另请查看this 以供参考。 -
@Andrew 那行得通!如果你把它写成答案,我会赞成/接受它!
-
我猜会很痛,以备日后参考。
标签: php laravel laravel-5 eloquent