【问题标题】:Laravel 4/PHP: Dynamic where clauses if a variable is not nullLaravel 4/PHP:如果变量不为空,则动态 where 子句
【发布时间】:2014-01-16 22:10:04
【问题描述】:

有没有办法创建动态 sql 查询,以便某些 where 子句仅在变量不为空时运行?

假设用户可以选择各种选项来过滤结果,如果不需要,他们可以选择不从某些下拉列表中选择选项。这将导致某些变量为空。

我想以一种不会导致编写 if 语句来满足每一种可能性的方式来做这件事。

不要介意 PHP 或 Laravel 特定答案中的建议。

谢谢!

【问题讨论】:

    标签: php mysql sql laravel laravel-4


    【解决方案1】:

    我更喜欢 if 语句,但您可以查看 Coalesce 运算符:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

    【讨论】:

    • 谢谢,我去看看。我认为如果稍后添加更多过滤器选项,if 语句可能会有点混乱。除非有一种方法可以将查询创建为字符串并根据设置的变量附加到它,但这似乎不起作用。
    【解决方案2】:

    创建客户端 jQuery 函数
    你可以做的一件事是写一点,如果 jQuery 通过你所有的输入客户端并且只提交值不为空/空的输入。 jquery 代码可用于您的所有表单或输入数据。因此,您永远不会将具有空值的传递参数传入您的服务器端控制器(并最终进入您的动态查询)。您可以在 stackoverflow question here 中找到解决方案。就个人而言,我只是将所有输入都放在一个类中,然后循环通过它来删除空值。请参阅我的 simple Fiddle here。您甚至可以为特殊类型的输入创建特殊条件,这样您的脚本就可以根据需要涵盖所有类型的 null/empty/etc。

    在 PHP/Laravel 中创建辅助函数
    您也可以在服务器端执行此操作。您可以编写一个辅助函数,循环遍历所有输入并删除空输入。它还可以同时为您构建 WHERE 子句(可以是原始的,或者您可以将查询对象传递给帮助程序,它可以添加每个 ->where,因为它循环输入并将查询对象返回给您) .

    $query = DB::table('my_table')->select('abc', 'xyz');
    
    // This could be your helper. Pass in your query and input...
    dynamicWhereHelper($query, Input::all()); 
    
    $rows = $query->get();
    

    在你的 dynamicWhereHelper 中:

    function dynamicWhereHelper($query, $input = array()) 
    {
       // Assuming you named each of your inputs the same as your database fields
       foreach ($input as $key => $value){
          if(!empty($value)){ 
              $query->where($key, $value); 
          }
       }
    }
    

    注意:更安全的方法是另外传递一个可接受的输入名称数组,以验证没有随机的$key 被传递到 WHERE。您可以为每个构建的页面定义一次此数组,它可以用于构建您的表单,然后在帮助器中使用:dynamicWhereHelper($query, Input::all(), $acceptableInputs);

    【讨论】:

    • 感谢您的详细解答!在我晚上打电话之前,我找到了使用 Laravel if ($fork) $query->where('forkmaterial', '=', $fork) 之类的选项,这似乎可以很好地完成这项工作,而且它和我希望的一样干净。
    猜你喜欢
    • 2012-07-16
    • 2018-12-23
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多