【发布时间】:2020-01-22 04:36:51
【问题描述】:
我试图弄清楚为什么我的查询忽略了除标题和描述之外的所有内容。指向控制器的搜索按钮用于按类别、按地区、按价格过滤不同类型的广告。 例如,如果我现在搜索现有广告,并且通过标题/关键字找到它 -> 将始终显示,即使我选择不同的地区/类别/价格范围
我正在尝试使用可以为我节省大量 if 语句的东西来检查它们是否存在于请求中。也许其他选项可以使用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);
我的获取参数 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,其他所有最佳参数都相同。
【问题讨论】:
-
您的所有查询(类别、区域、类型)是否都包含在单个表中?
-
都是相关的,但是id-s在当前表中,是的
-
那么例如,Ad belongsTo / has category?
-
是的,category、condition、region,它们是通过 belongsTo 关联的
标签: php laravel search eloquent