假如現在我接收到前端傳來的表單數組:
$input = $request->input();
裡麵包含4個值:email,姓名,年齡,性別.現在需要根據用戶輸入的值進行數據表的查詢,如果用戶輸入了email和姓名,則進行模糊查詢,如果輸入了年齡和性別,則進行準確查詢.
可是問題來了,這4個input,用戶可能填寫一個,也可能填寫4個,那我使用查詢建構器的時候,不可能判斷每個值是否存在,然後寫構造器吧,畢竟模糊查詢跟準確查詢的寫法不同,而且比如現在我有兩個字段(email和姓名)是需要模糊查詢的,laravel進行模糊查詢的構造器是這樣寫的:
->where('email', 'LIKE', $input['email'])
那我必須在程式中判斷email和姓名是否存在的情況,然後來拼接查詢建構器嗎?
這個想法是:
1.email存在,姓名不存在
->where('email', 'LIKE', $input['email'])
2.email不存在,姓名存在
->where('name', 'LIKE', $input['name'])
3.都存在
->where('email', 'LIKE', $input['email'])->->where('name', 'LIKE', $input['name'])
這些的程式碼量也太大了,如果我有十個字段模糊查詢,那根本無法使用構造器了.
請問大家是不是有一種其他的方式,比如:
if($input['email']) $where['email'] = $input['email']
if($input['name']) $where['name'] = $input['name']
然後使用:
->where( 'LIKE', $where),這樣我一行就包括了所有可能存在也可能不存在的情況,
網上推薦過其他寫法:
$where['email'] = [ 'like', $input['email']],但是我的laravel5.1並不能用.
請問大家有什麼好的方法解決多條件模糊查詢和非模糊查詢嗎?
PHP中文网2017-05-16 12:04:58
Laravel是可以在where中傳匿名函數的。
你可以在這個匿名函數裡判斷。
像這樣
where(function ($query) use ($request) {
$request->input('email') && $query->where('email', $request->input('email'));
$request->input('name') && $query->where('name', $request->input('name'));
})
這樣你可以在不破壞構造器結構的情況下進行應有的判斷。
某草草2017-05-16 12:04:58
沒有用過5.1,不過5.4有個when方法,例:
$query->when($name, function($query) use ($name){
$query->where('name', 'like', '%' . $name . '%');
});
意思就是當$name
不為空的時候,才執行後面的function
你查一下5.1有沒有類似方法吧
滿天的星座2017-05-16 12:04:58
話說查詢建構器的where()
方法是返回$this
的 -- 所以可以連著寫,但是也並沒有說你必須要連著寫呀!
字段比較多的時候寫個for循環比較OK了嗎:
$query = XXXModel::query();
for ($field in ['name', 'email', "... 你相加什么字段加什么字段"]){
if ($fieldValue = $request->input($field)){
$query->where($field, 'LIKE', "%$fieldValue%");
}
}
// 继续添加where条件,或者查询数据...