php - laravel如何拼接多個模糊條件查詢?
ringa_lee
ringa_lee 2017-05-16 12:02:58
0
5
1728

假如現在我接收到前端傳來的表單數組:
$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並不能用.
請問大家有什麼好的方法解決多條件模糊查詢和非模糊查詢嗎?

ringa_lee
ringa_lee

ringa_lee

全部回覆(5)
洪涛

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'));
})

這樣你可以在不破壞構造器結構的情況下進行應有的判斷。

某草草

沒有用過5.1,不過5.4有個when方法,例:

$query->when($name, function($query) use ($name){
    $query->where('name', 'like', '%' . $name . '%');
});

意思就是當$name不為空的時候,才執行後面的function

你查一下5.1有沒有類似方法吧

滿天的星座

話說查詢建構器的where()方法是返回$this的 -- 所以可以連著寫,但是也並沒有說你必須要連著寫呀!

字段比較多的時候寫個for循環比較OK了嗎:


$query = XXXModel::query();

for ($field in ['name', 'email', "... 你相加什么字段加什么字段"]){
    if ($fieldValue = $request->input($field)){
        $query->where($field, 'LIKE', "%$fieldValue%");
    }
}

// 继续添加where条件,或者查询数据...
小葫芦

雷雷

大家讲道理

肯定是要做判斷的,不管是你做判斷還是框架做判斷。如果有10個欄位去做模糊查詢,那你的mysql吃消失嗎,直接改用搜尋引擎了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板