4 回答
TA贡献1802条经验 获得超10个赞
我假设你需要你的查询/过滤器是动态的。
您的 html 脚本可以遵循以下模式/格式:
<input type="checkbox" name="filter1" value="new">
<input type="checkbox" name="filter1" value="used">
<input type="checkbox" name="filter1" value="pre-registered">
<select name="filter2" id="">...</select>
<select name="filter3" id="">...</select>
在 Php 文件中,您可以使用一些条件来附加查询条件/过滤器:
$criteria = "";
if($request->get('filter1'))
{
$criteria .= " AND `filter1` = '".addslashes($request->get('filter1'))."'";
}
if($request->get('filter2'))
{
$criteria .= " AND `filter2` = '".addslashes($request->get('filter2'))."'";
}
//and so on...
//output
$query = DB::select("SELECT * FROM your_table WHERE 1 = 1 {$criteria}");
笔记:
您可能需要谨慎地形成$criteria,因为它可能仍然有机会使用DB::select方法进行 Sql 注入,但我相信您可以使用相同的逻辑来适应使用 Laravel Eloquent 方法。
TA贡献1757条经验 获得超8个赞
我会改变这个:
$new = $request->get('new');
$used = $request->get('used');
$registered = $request->get('registered');
$make = $request->get('make');
$model = $request->get('model');
$price = $request->get('price');
$city = $request->get('city');
$registration = $request->get('firstRegistration');
对此:
$new = (empty($request->get('new')) ? "%" : $request->get('new');
$used = (empty($request->get('used')) ? "%" : $request->get('used');
$registered = (empty($request->get('registered')) ? "%" : $request->get('registered');
$make = (empty($request->get('make')) ? "%" : $request->get('make');
$model = (empty($request->get('model')) ? "%" : $request->get('model');
$price = (empty($request->get('price')) ? "%" : $request->get('price');
$city = (empty($request->get('city')) ? "%" : $request->get('city');
$registration = (empty($request->get('firstRegistration')) ? "%" : $request->get('firstRegistration');
TA贡献1946条经验 获得超4个赞
这是您的问题的解决方案
public function filterSearch(Request $request){
$make = $request->get('make');
$model = $request->get('model');
$price = $request->get('price');
$city = $request->get('city');
$registration = $request->get('firstRegistration');
$searchFields = [
'new',
'used',
'registered'
];
$query = DB::table('ads')->where(function ($query) use ($searchFields, $request) {
collect($searchFields)->each(function($field) use($likeCriteria, $query) {
$likeCriteria = $request->get($field);
if ($likeCriteria === '') {
$likeCriteria = '%';
}
$query->orWhere($field, 'like', '%' . $likeCriteria . '%');
});
})->get();
$decode = json_decode(json_encode($query),true);
$finalArr = array();
for($i=0; $i<count($decode); $i++){
if($make || $model || $registration){
if(($decode[$i]['make'] == $make) || ($decode[$i]['model'] == $model) || ($decode[$i]['registration'] == $registration)){
array_push($finalArr,$decode[$i]);
}
}else{
array_push($finalArr,$decode[$i]);
}
}
return response()->json(['success'=>$finalArr], 200);
}
首先,将要搜索的所有变量移动到数组中,$searchFields这样我们就可以避免代码重复并使用干净的代码。
更改您的数据库查询,以便我们可以使用带有查询功能的table方法where来移动其中的所有逻辑,并避免 SQL 注入。
TA贡献1803条经验 获得超3个赞
我会尝试将查询存储到一个变量,然后使用三元条件或三元条件添加选择(如果 isset 或不为空)
$query=""SELECT * FROM ads WHERE 1=1 ";
$query.=(isset($new) && $new!='' ? " OR vehicleCond LIKE '%" . $new . "%'" : "");
$query.=(isset($used) && $used!='' ? " OR vehicleCond LIKE '%" . $used. "%'" : "");
$query.=(isset($registered) && $registered!='' ? " OR vehicleCond LIKE '%" . $registered. "%'" : "");
//and so on depends on your selection variables
//after that
$query = DB::select($query);
干杯
- 4 回答
- 0 关注
- 121 浏览
添加回答
举报