Laravel 4 / PHP:如果变量不为null,则为dynamic where子句

时间:2014-01-16 22:10:04

标签: php mysql sql laravel laravel-4

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

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

我想以一种不会导致写作的方式来做,如果语句能够满足每一种可能性。

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

OR

在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);