想象一下这个简单的查询。
User::with(['company' => function ($query) use($request) {
$query->where('companies.name', 'like', '%'.$request->name.'%');
}])->get();
如果指定的公司不存在,这可能会返回类似于以下集合的内容。
"data": [
{
"id": 1,
"company": null
}
],
查询将运行并返回一个集合,即使公司值为null
。问题是在这种情况下我不希望返回记录。我只想要“公司”不为空的记录。
如何在查询中实现呢?
答案 0 :(得分:2)
使用->with(["company" => function(){ ... }])
不会基于逻辑过滤父User
查询,它只是限制了company
关系中返回的内容。要限制AND过滤,您需要结合使用->whereHas()
和->with()
:
User::with(["company"])->whereHas("company", function($query) use($request){
$query->where("companies.name", "like", "%".$request->name."%");
})->get();
在某些情况下,您可能需要将->whereHas()
中的逻辑复制到->with()
中的函数,但是由于您是基于关系来限制查询结果,因此您不必