如何在Laravel中简化多搜索?

时间:2016-11-15 06:15:08

标签: php laravel laravel-5

有时我们在Laravel中使用这样的场景,如下所示:

if (!empty($request->input('user_name'))) {
    $where[] = ['user_name', 'like', "%" . $request->input('user_name') . "%"];
}
if (!empty($request->input('group_id'))) {
    $where[] = ['group_id', $request->input('group_id') ];
}
if (!empty($request->input('email'))) {
    $where[] = ['email', 'like', "%" . $request->input('email') . "%"];
}

if (!empty($request->input('mobile'))) {
    $where[] = ['mobile', 'like', "%" . $request->input('mobile') . "%"];
}
$users = User::where($where)->get();

但它太丑了,但我只想使用这个User::search($request->only(['user_name', 'email', 'mobile']));,也许我们必须为输入名称的键名设计一些规则,你对这个条件有一些好主意吗?感谢。

3 个答案:

答案 0 :(得分:6)

您可以创建local scope

public function scopeSearch($q, $inputs)
{
    $where = [];

    foreach ($inputs as $key => $data) {
        $where[] = [$key, 'like', "%".$data."%"];
    }

    return $q->where($where);
}

然后使用它:

User::search($request->only(['user_name', 'email', 'mobile']))->get();

答案 1 :(得分:1)

为了方便搜索,我稍微改进了它:

//use style
User::search(['eq'=>$request->only(['is_messaged', 'is_mailed', 'status']), 'like' => $request->only(['user_name', 'mobile'])]);
//the implement method
public function scopeSearch($query, $conditions)
{
    $where = [];

    foreach ($conditions as $key => $condition) {
        if ($key == 'like') {
            foreach ($condition as $whereKey => $whereValue) {
                if ($whereValue == '') continue;
                $where[] = [$whereKey, 'like', $whereValue."%"];
            }
        }
        if ($key == 'eq') {
            foreach ($condition as $whereKey => $whereValue) {
                if ($whereValue == '') continue;
                $where[] = [$whereKey, $whereValue];
            }
        }
    }

    return $query->where($where);
}

答案 2 :(得分:0)

你可以不循环地完成这项工作

$ string =' CASE WHEN'"。$ request-> input(' user_name')。"' !=''那么user_name喜欢"%"。'"。$ request->输入(' user_name')。"'。'。 34;%" 当$ request->输入时(' group_id')!=''那么group_id ='"。$ request->输入(' group_id')。"' 情况下'"。$ request->输入('电子邮件')。"' !=''然后发送电子邮件,例如"%"。'"。$ request->输入('电子邮件')。"'。&#39。 34;%" 情况下'"。$ request->输入(' mobile')。"' !=''那么移动就像"%"。'"。$ request->输入('移动')。"'。'。 34;%"  &#39 ;;

$ users = User :: whereRaw($ string) - > get();