【问题标题】:Filter dataset to be queried later过滤后要查询的数据集
【发布时间】:2015-02-13 22:08:02
【问题描述】:

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

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

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

有没有简单的方法来做到这一点?

【问题讨论】:

    标签: php database laravel eloquent


    【解决方案1】:

    这可以简单得多。只需将 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. query() 仅在您想在模型上“启动”新查询但没有任何应用(位置、排序依据、限制等)时才需要。您可以毫无问题地使用People::where(...)

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


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

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

    【讨论】:

      【解决方案2】:
      $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'));
      }
      

      您不必实现所有情况

      【讨论】:

        猜你喜欢
        • 2017-06-08
        • 2021-07-19
        • 2014-08-15
        • 1970-01-01
        • 2017-12-26
        • 2021-05-30
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多