How to simplify your search in Laravel?

Sometimes this is a scene where we use where in Laravel, for example:

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();

but its so ugly, but I just want to use this one User::search($request->only(['user_name', 'email', 'mobile']));, maybe we need to develop some rules for the name key of the input name, and do you have a good idea for this condition? Thank.

+4
source share
3 answers

You can create a local scope :

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

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

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

And then use it:

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

For the convenience of the search, I slightly improved it as follows:

//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);
}
+1
source

$string = 'CASE WHEN' ". $request- > input ('user_name')." '! =' 'THEN user_name, "%" .' ". $request- > input ('user_name').". "%" WHEN $request- > input ('group_id')!= '' THEN group_id = ' ". $Request- > input (' group_id ')." ' CASE WHEN ' ". $Request- > input (' email ').' '! =' 'THEN email, " % "." ". $Request- > input (' email ')." '. "%" CASE WHEN ' ". $Request- > input (' mobile ').' '! =' 'THEN mobile like" % ".'". $Request- > input ('mobile'). "'." % " ";

$users = :: whereRaw ($ string) β†’ get();

0
source

Source: https://habr.com/ru/post/1660748/


All Articles