2016-07-28 94 views
0

我想用laravel創建一個搜索表單,但是我無法獲得where子句的工作方式。

Laravel - Where子句不起作用

$term = $request->input('term'); 

$count = DB::table('members as m') 
     ->where(DB::raw('m.member_first_name'), 'LIKE', "%$term%") 
     ->orWhere(DB::raw('m.member_last_name'), 'LIKE', "%$term%") 
     ->orWhere(DB::raw('m.member_business_address'), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_last_name')"), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_name_affix',' ','m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
     ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_name_affix',' ','m.member_last_name')"), 'LIKE', "%$term%") 
     ->count(); 

var_dump($count); 



的var_dump($計數)總是返回所有的數據庫條目,不管搜索詞是什麼。


這是我第一個Laravel項目,我非常感謝任何幫助。

+1

做一個'dd(DB :: getQueryLog());'在var_dump之後檢查正在生成的查詢是什麼並在此處發佈。 – Kamran

+0

生成的查詢在執行之前是什麼樣的? – Walf

回答

2

也許嘗試包裹查詢在一個整體,其中:

$count = DB::table('members as m') 
     ->where(function ($q) { 
      $q->where(DB::raw('m.member_first_name'), 'LIKE', "%$term%") 
      ->orWhere(DB::raw('m.member_last_name'), 'LIKE', "%$term%") 
      ->orWhere(DB::raw('m.member_business_address'), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_last_name')"), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_name_affix',' ','m.member_last_name',' ','m.member_first_name')"), 'LIKE', "%$term%") 
      ->orWhere(DB::raw("concat('m.member_first_name',' ','m.member_name_affix',' ','m.member_last_name')"), 'LIKE', "%$term%") 
     }) 
     ->count(); 
+0

謝謝!它現在有效!我會在7分鐘內接受你的回答! – Schwesi

+0

@kringeltorte你不用'whereRaw()'而不是'where(DB :: raw())'並且通過直接在查詢生成器中使用'「%$ term%」''有些人可能能夠應用'sql注入'這裏。 – Avishek

+0

@Avishek這個函數的一部分仍然被Eloquent分析以防止SQL注入。我不是100%,但我認爲通過使用whereRaw在整個where子句中這將繞過Eloquents消毒方法並打開SQL注入。 – Jono20201

0

您使用/在一起,這當然會失敗。請嘗試以下操作:

$count = DB::table('members as m') 
    ->where(DB::raw('m.member_first_name'), 'LIKE', "%$term%") 
    ->where(function ($query) { 
      $query->where(DB::raw('m.member_last_name'), 'LIKE', "%$term%") 
       ->orWhere(DB::raw('m.member_business_address'), 'LIKE', "%$term%")); 
     }) 
0

簡單地嘗試這個代碼,如果你有一些語法錯誤,然後嘗試在這裏改變'符號和there..as我不能發佈之前,測試它..

$term = "%".$request->input('term')."%"; 
$count = DB::table('members as m') 
     ->where('m.member_first_name', 'LIKE', $term) 
     ->orWhere('m.member_last_name', 'LIKE', $term) 
     ->orWhere('m.member_business_address', 'LIKE', $term) 
     ->orWhereRaw('(concat_ws(m.member_first_name,m.member_last_name) LIKE ?)',[$term]) 
     ->orWhereRaw('(concat_ws(m.member_last_name,m.member_first_name) LIKE ?)',[$term]) 
     ->orWhereRaw('(concat_ws(m.member_name_affix,m.member_last_name,m.member_first_name) LIKE ?)',[$term]) 
     ->orWhereRaw('(concat_ws(m.member_first_name,m.member_name_affix,m.member_last_name) LIKE ?)',[$term]) 
     ->count(); 

var_dump($count); 

你可以使用whereRaw()不需要把DB::raw()放在where()的內部。