2017-08-19 66 views
1

我一直試圖做的Laravel查詢,在原始的SQL會是這樣雄辯WHERE LIKE子句有兩個以上的列

"SELECT * FROM students WHERE (((students.user_id)=$id) AND (((students.name) Like '%$q%') OR ((students.last_name) Like '%$q%') OR ((students.email) Like '%$q%')))") 

我按照這個線程(Eloquent WHERE LIKE clause with multiple columns),它工作得很好,但只有兩列EJ:

$students = student::where(user_id, Auth::id()) 
     ->whereRaw('concat(name," ",last_name) like ?', "%{$q}%") 
     ->paginate(9); 

但是,如果我添加兩個以上的列後,將所得變量始終是空的,不管是什麼在變量$ q比賽與一列或多列:

$students = student::where(user_id, Auth::id()) 
     ->whereRaw('concat(name," ",last_name," ",email) like ?', "%{$q}%") 
     ->paginate(9) 

我很確定我錯過了一些東西,但我找不到它是什麼。提前致謝。

+0

SQL的毗連返回null如果任何字段爲空。這不是問題嗎?考慮到它與2的工作,第三個領域是可疑的... –

+0

好吧,所以這是問題,但我該如何解決它,因爲我允許人們存儲電子郵件,但不是強制性的,但這是爲了過濾表用一個簡單的搜索,所以我希望它過濾考慮到所有的列,也就是說,如果其中一個是空的不要轉換所有其他的空 –

+0

使用'concat_ws'而不是'concat'可以幫助解決NULL正確。但是mbozwood的回答似乎對我來說更加雄辯。 –

回答

2

你可以做這樣的事情:

$students = student::where('user_id', Auth::id())->where(function($query) use ($q) { 
    $query->where('name', 'LIKE', '%'.$q.'%') 
     ->orWhere('last_name', 'LIKE', '%'.$q.'%') 
     ->orWhere('email', 'LIKE', '%'.$q.'%'); 
})->paginate(9); 

以上能言善辯將輸出類似於

"SELECT * FROM students WHERE students.user_id = $id AND (students.name like '%$q%' OR students.last_name Like '%$q%' OR students.email Like '%$q%')" 
+0

偉大的人,非常感謝。只是測試和工作很好 –