有没有办法创建动态sql查询,以便某个where子句仅在变量不为null时运行?
因此,用户可以选择各种选项来过滤结果,如果他们不需要,他们可以选择不从某些下拉列表中选择一个选项。这将导致某些变量为空。
我想以一种不会导致写作的方式来做,如果语句能够满足每一种可能性。
不要介意PHP或Laravel特定答案中的建议。
谢谢!
答案 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);