假如現(xiàn)在我接收到前端傳來的表單數(shù)組:
$input = $request->input();
里面包含4個值:email,姓名,年齡,性別.現(xiàn)在需要根據(jù)用戶輸入的值進(jìn)行數(shù)據(jù)表的查詢,如果用戶輸入了email和姓名,則進(jìn)行模糊查詢,如果輸入了年齡和性別,則進(jìn)行準(zhǔn)確查詢.
可是問題來了,這4個input,用戶可能填寫一個,也可能填寫4個,那我使用查詢構(gòu)造器的時候,不可能判斷每個值是否存在,然后寫構(gòu)造器吧,畢竟模糊查詢跟準(zhǔn)確查詢的寫法不同,而且比如現(xiàn)在我有兩個字段(email和姓名)是需要模糊查詢的,laravel進(jìn)行模糊查詢的構(gòu)造器是這樣寫的:
->where('email', 'LIKE', $input['email'])
那我必須在程序中判斷email和姓名是否存在的情況,然后來拼接查詢構(gòu)造器嗎?
這個思路是:
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'])
這些的代碼量也太大了,如果我有十個字段模糊查詢,那根本無法使用構(gòu)造器了.
請問大家是不是有一種其他的方式,比如:
if($input['email']) $where['email'] = $input['email']
if($input['name']) $where['name'] = $input['name']
然后使用:
->where( 'LIKE', $where),這樣我一行就包括了所有可能存在也可能不存在的情況,
網(wǎng)上推薦過其他寫法:
$where['email'] = ['like', $input['email']],但是我的laravel5.1并不能用.
請問大家有什么好的方法解決多條件模糊查詢和非模糊查詢嗎?
ringa_lee
Laravel是可以在where中傳匿名函數(shù)的。
你可以在這個匿名函數(shù)里判斷。
比如像是這樣
where(function ($query) use ($request) {
$request->input('email') && $query->where('email', $request->input('email'));
$request->input('name') && $query->where('name', $request->input('name'));
})
這樣你可以在不破壞構(gòu)造器結(jié)構(gòu)的情況下進(jìn)行應(yīng)有的判斷。
沒有用過5.1,不過5.4有個when方法,示例:
$query->when($name, function($query) use ($name){
$query->where('name', 'like', '%' . $name . '%');
});
意思就是當(dāng)$name
不為空的時候,才執(zhí)行后面的function
你查一下5.1有沒有類似方法吧
話說查詢構(gòu)建器的where()
方法是返回$this
的 -- 所以可以連著寫,但是也并沒有說你必須要連著寫呀!
字段比較多的時候?qū)憘€for循環(huán)比較OK了嗎:
$query = XXXModel::query();
for ($field in ['name', 'email', "... 你相加什么字段加什么字段"]){
if ($fieldValue = $request->input($field)){
$query->where($field, 'LIKE', "%$fieldValue%");
}
}
// 繼續(xù)添加where條件,或者查詢數(shù)據(jù)...
$query = DB::table($table_name);
foreach ($conditions as $condition) {
$query->where($condition, 'LIKE' $input($ocndition);
}
$query->get();