在数据库级别

时间:2016-07-31 21:26:24

标签: php laravel laravel-5 eloquent

在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中有一种简单的方法吗?

1 个答案:

答案 0 :(得分: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);
}

老实说,我没有尝试过,但它应该有用。