筛选稍后要查询的数据集


Filter dataset to be queried later

我想查询一个有说服力的模型。目前,它是这样做的:

$query = People::query()->where('something', '=', $something');

我想为用户添加3个下拉列表,以选择他或她想要找到的人的类型。这些下拉列表将是sexhair colorbody type,当然所有这些都是可选的。如果填写完毕,这些值也将出现在查询字符串中。

这就是我试图做的:

if (Input::has('sex')) {
 $query = People::query()->where('sex', '=', $sex);
}
else
if (Input::has('sex') && Input::has('haircolor')) {
 $query = People::query()->where('sex', '=', Input::get('sex'))->where('hair_color', '=', Input::get('haircolor'));
}
else
if (Input::has('sex') && Input::has('bodytype')) {
 $query = People::query()->where('sex', '=', Input::get('sex'))->where('body_type', '=', Input::get('bodytype'));
}
else
if (Input::has('sex') && Input::has('haircolor') && Input::has('bodytype')) {
 $query = People::query()->where('sex', '=', Input::get('sex'))->where('hair_color', '=', Input::get('haircolor'))->where('body_type', '=', Input::get('bodytype'));
}
else {
 $query = People::query();
}

除了非常丑陋的意大利面条代码之外,这个代码的主要问题是第一个条件几乎总是匹配的,所以它不准确。

有简单的方法吗?

这可以做得简单得多。只需有条件地将where添加到您的查询中即可:

$query = People::query();
if(Input::has('sex')){
    $query->where('sex', Input::get('sex'));
}
if(Input::has('bodytype')){
    $query->where('body_type', Input::get('bodytype'));
}
if(Input::has('haircolor')){
    $query->where('hair_color', Input::get('haircolor'));
}
$results = $query->get();

几个注意事项:

  1. 只有当您想在模型上"启动"一个新查询,但没有任何内容(如where、order by、limit等)时,才需要query()。你可以做People::where(...)没有任何问题

  2. where语句中的=可以省略。如果只传递了两个参数,Laravel将选择=作为默认运算符


如果您对输入参数和数据库列进行相同的命名,您甚至可以这样做:

$filters = Input::only('sex', 'body_type', 'hair_color');
$query = People::query();
foreach($filters as $key => $value){
    $query->where($key, $value);
}
$results = $query->get();
$query = People::query();
if (Input::has('sex')) {
    $query = $query->andWhere('sex', '=', $sex);
}
if (Input::has('haircolor')) {
    $query = $query->andWhere('hair_color', '=', Input::get('haircolor'));
}
if (Input::has('bodytype')) {
    $query = $query->andWhere('body_type', '=', Input::get('bodytype'));
}

您不必实现

的所有情况