如何在laravel中使用两个或更多个组合进行过滤

时间:2018-11-26 11:26:22

标签: laravel

enter code here我的问题是通过使用eloquent来了解laravel中的组合过滤器。

我正在尝试使用以下各项进行过滤:

username
Category
Sub_category
started_at
created_at
status

我使用where条件,但不能按要求工作。

public function filter(Request $request, User $user)
{
    $user = $user->newQuery();

    // Search for a user based on their name.
    if ($request->has('username')) {
        $user->where('name', $request->input('username'));
    }

    // Search for a user based on their Category.
    if ($request->has('Category')) {
        $user->where('Category', $request->input('Category'));
    }

    // Search for a user based on their Sub_category.
    if ($request->has('Sub_category')) {
        $user->where('Sub_category', $request->input('Sub_category'));
    }
 // Search for a user based on their started_at.
    if ($request->has('started_at')) {
        $user->where('started_at', $request->input('started_at'));
    }
 // Search for a user based on their status.
    if ($request->has('status')) {
        $user->where('status', $request->input('status'));
    }


    // Continue for all of the filters.

    // Get the results and return them.
    return $user->get();
}

2 个答案:

答案 0 :(得分:0)

这是我的应试者

 public function filter(Request $request)
    {
       $q = User::query();
       $email = $request->input('email');
       $username= $request->input('username');

        $q->when($email,function ($query) use ($email){
           $query->where('email',$email);
        });

        $q->when($username,function ($query) use ($username){
           $query->where('username',$username);
        });

       $results = $q->get();
       //code

    }

答案 1 :(得分:0)

您应该将where条件保存到$ user变量中。

$user = $user->where($dbField, $request->input($requestParam));

为了提高可读性,我建议对所有过滤情况使用循环。

public function filter(Request $request)
{
    $users = User::query();

    $filters = [
        'username' => 'name',
        'Category' => 'Category',
        'Sub_category' => 'Sub_category',
        'started_at' => 'started_at',
        'status' => 'status'
    ];

    foreach ($filters as $requestParam => $dbField){
        if ($request->has($requestParam)) {
            $users = $users->where($dbField, $request->input($requestParam));
        }
    }

    return $users->get();
}

请记住,$request->has不会检查参数值是否为空,如果需要,请使用$request->filled