我正在尝试创建一个搜索过滤器:
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
数据。
你应该能够通过使用->with()
eloquent方法实现这一目标。如果请求有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()
助手。
你的问题似乎每个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();