我正在尝试创建搜索过滤器:
if ($request->has('street')) {
$streets->where('name', 'like', '%'.$request->street.'%');
}
if ($request->has('house')) {
$streets->whereHas('properties', function ($query) use ($request) {
$query->where('house_number', $request->house);
});
}
return $streets->get();
这当前获取street
数据。我想做类似?street=b-34&house=21
的事情并显示house
数据。
此刻,我仅获得street
数据。
答案 0 :(得分:3)
您的问题似乎每个Laravel开发人员都会经历一天。您忘记了将查询返回到原始构造函数。
您有:
$streets->where('name', 'like', '%'. request('street') .'%');
何时应该拥有:
$streets = $streets->where('name', 'like', '%'. request('street') .'%');
您正在链接方法,因此您应该让它返回原始查询构造函数
编辑基于评论:
除了不返回如上所述的查询之外,您还使用了whereHas
,就像@thisiskelvin在他的回答中指出的那样。
您应该使用
if (request()->has('street')) {
$streets = $streets->where('name', 'like', '%'. request('street') .'%');
}
if (request()->has('house')) {
$streets = $streets->with(['properties' => function ($query) {
$query->where('house_number', request('house'));
}]);
}
return $streets->get();
答案 1 :(得分:0)
您应该能够使用->with()
雄辩的方法来实现这一目标。如果请求有一个house
查询,它将返回所有properties
,其中house_number
等于查询到的门牌号码。找到后将附加到返回的结果中:
if (request()->has('street')) {
$streets = $streets->where('name', 'like', '%'. request('street') .'%');
}
if (request()->has('house')) {
$streets = $streets->with(['properties' => function ($query) {
$query->where('house_number', request('house'));
}]);
}
return $streets->get();
注意:我已将$request
更改为使用request()
助手。