过滤稍后要查询的数据集

时间:2015-02-13 22:08:02

标签: php database laravel eloquent

我想查询一个雄辩的模型。目前,这就是它的完成方式:

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

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

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:0)

这可以做得更简单。只需根据您的查询有条件地添加数据:

$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. query()只有在您想要开始时才需要。对模型的新查询,但没有任何内容(地点,顺序,限制等)适用。您可以毫无问题地People::where(...)

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


  3. 如果您将输入参数和数据库列命名为相同,您甚至可以执行以下操作:

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

答案 1 :(得分:0)

$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'));
}

您不必实施所有情况