为什么我的过滤器请求互相重写?

时间:2017-11-05 17:47:58

标签: php laravel

我想做可以过滤用户的脚本。问题是我写了一个字段,然后另一个字段不起作用。始终只能处理最后一个请求,而不是全部。如何改变?

if ($request->has('city')) 
{
    $user = User::with('user_data')->whereHas('user_data', function($query) use ($request) { 
        return $query->where('residence', $request->city); 
    })->get();
}

if ($request->has('age_from')) 
{
    $user = User::with('user_data')->whereHas('user_data', function($query) use ($request) { 
        return $query->where('date_of_birth', '<=', Carbon::now()->subYears($request->age_from)); 
    })->get();
}

if ($request->has('age_to')) 
{
    $user = User::with('user_data')->whereHas('user_data', function($query) use ($request) { 
        return $query->where('date_of_birth', '>=', Carbon::now()->subYears($request->age_to)); 
    })->get();
}

2 个答案:

答案 0 :(得分:2)

看起来你的方式不正确。问题不足以完全想象你的问题。

但要解决这个问题,下面的技巧可能对你有帮助。

您可以像这样使用多个whereHas

$user = User::with('user_data')->whereHas('user_data', function($query) use ($request) { 
        return $query->where('residence', $request->city); 
    })
    ->whereHas('user_data', function($query) use ($request) { 
        return $query->where('date_of_birth', '<=', Carbon::now()->subYears($request->age_from)); 
    })
    ->whereHas('user_data', function($query) use ($request) { 
        return $query->where('date_of_birth', '>=', Carbon::now()->subYears($request->age_to)); 
    })->get();

如果您想按$request过滤它,请执行此操作。

$user = User::with('user_data');
        if ($request->has('city')) {
            $user->whereHas('user_data', function($query) use ($request) {
               return $query->where('residence', $request->city);
           });
        }
        if ($request->has('age_from')) {
            $user->whereHas('user_data', function($query) use ($request) {
                return $query->where('date_of_birth', '<=', Carbon::now()->subYears($request->age_from));
            });
        }
        if($request->has('age_to')){
            $user->whereHas('user_data', function($query) use ($request) {
                return $query->where('date_of_birth', '>=', Carbon::now()->subYears($request->age_to));
            });
        }
        $user = $user->get();

答案 1 :(得分:0)

通常,当您的HTML中未禁用所有输入字段时,所有输入字段都会显示在请求中,因此它不依赖于字段值以及您对输入变量的可用性的检查使用 has()方法始终为填充和空白输入返回 true

所以你需要使用input()方法检查值。

此外,虽然请求中可能有多个输入值,但您需要在获得结果之前将标准添加到模型中:

$user = User::with('user_data');
if ($request->input('city')) 
{
    $user->whereHas('user_data', function($query) use ($request) { 
        $query->where('residence', $request->city); 
    });
}

if ($request->input('age_from')) 
{
    $user->whereHas('user_data', function($query) use ($request) { 
        $query->where('date_of_birth', '<=', Carbon::now()->subYears($request->age_from)); 
    });
}

if ($request->input('age_to')) 
{
    $user->whereHas('user_data', function($query) use ($request) { 
        $query->where('date_of_birth', '>=', Carbon::now()->subYears($request->age_to)); 
    });
}
$user = $user->get();