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 關注
- 147 瀏覽
添加回答
舉報