我正在尝试弄清楚为什么我的查询忽略了除标题和描述之外的所有内容。通向控制器的搜索按钮用于按类别、按地区、按价格过滤不同类型的广告。例如,如果我现在搜索现有的广告,其按标题/关键字找到,即使我选择了不同的地区/类别/价格范围,->也会始终显示
我正在尝试使用一些可以节省大量if语句的东西来检查它们是否存在于请求中。也许其他选项si可以使用https://github.com/mohammad-fouladgar/eloquent-builder构建我的查询
public function index(Request $request)
{
$keyword = $request['keyword'];
$category_id = $request['category_id'];
$type_id = $request['type_id'];
$region_id = $request['region_id'];
$min_price = $request['min_price'];
$max_price = $request['max_price'];
$result = Ad::when($keyword, function ($q) use ($keyword) {
return $q->where('title', 'like', '%' . $keyword . '%')->orWhere('description', 'like', '%' . $keyword . '%');
})
->when($category_id, function ($q) use ($category_id) {
return $q->where('category_id', $category_id);
})
->when($region_id, function ($q) use ($region_id) {
return $q->where('region_id', '=', $region_id);
})
->when($type_id, function ($q) use ($type_id) {
return $q->where('adtype_id', '=', $type_id);
})
->when($min_price, function ($q) use ($min_price) {
return $q->where('price', '>=', $min_price);
})
->when($max_price, function ($q) use ($max_price) {
return $q->where('price', '<=', $max_price);
})
->paginate(8);我的get参数url是这样的: search?keyword=&category_id=0®ion_id=0&type_id=0&min_price=&max_price=
在mysql中,当我按名称搜索现有广告并查找不同的类别时,生成的查询为:
select * from `ads` where `title` like '%test test%' or `description` like '%test test%' and `category_id` = '2' limit 8 offset 0找到了广告,但实际类别是1,而不是2,对于所有其他最佳参数都是相同的。
发布于 2019-09-21 19:54:14
您可以使用whereHas编辑查询以查找特定关系。此方法将允许您在关系约束中添加自定义约束,例如检查comment.And的内容以检查最大/最小价格,使用where方法。所以,你可以这样使用它:
$result = Ad::when($keyword, function ($q) use ($keyword) {
return $q->where('title', 'like', '%' . $keyword . '%')->orWhere('description', 'like', '%' . $keyword . '%');
})
->whereHas('category_relation_name', function ($q) use ($category_id) {
return $q->where('category_id', $category_id);
})
->whereHas('region_relation_name', function ($q) use ($region_id) {
return $q->where('region_id', $region_id);
})
->whereHas('type_relation_name', function ($q) use ($type_id) {
return $q->where('adtype_id', $type_id);
})
->where('price', '>=', $min_price);
->where('price', '<=', $max_price);
->paginate(8);https://stackoverflow.com/questions/58039883
复制相似问题