【问题标题】:Filtering models by eager loaded data, at the database level在数据库级别通过预先加载的数据过滤模型
【发布时间】: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


【解决方案1】:

为了实现您要查找的内容,您可以使用以下查询:

App\Book::with('author.contacts')
->whereHas('author.contacts' => function($q){ 
     $q->where('zip', 12345)}
)
->get();

您也可以在contacts 模型中使用类似的查询,类似于以下内容:

public function withZipCode()
{
    return Contacts::where('zip', 12345);
}

老实说,我还没有尝试过,但它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2021-07-28
    • 2021-07-10
    相关资源
    最近更新 更多