【发布时间】:2014-01-16 22:10:04
【问题描述】:
有没有办法创建动态 sql 查询,以便某些 where 子句仅在变量不为空时运行?
假设用户可以选择各种选项来过滤结果,如果不需要,他们可以选择不从某些下拉列表中选择选项。这将导致某些变量为空。
我想以一种不会导致编写 if 语句来满足每一种可能性的方式来做这件事。
不要介意 PHP 或 Laravel 特定答案中的建议。
谢谢!
【问题讨论】:
标签: php mysql sql laravel laravel-4
有没有办法创建动态 sql 查询,以便某些 where 子句仅在变量不为空时运行?
假设用户可以选择各种选项来过滤结果,如果不需要,他们可以选择不从某些下拉列表中选择选项。这将导致某些变量为空。
我想以一种不会导致编写 if 语句来满足每一种可能性的方式来做这件事。
不要介意 PHP 或 Laravel 特定答案中的建议。
谢谢!
【问题讨论】:
标签: php mysql sql laravel laravel-4
我更喜欢 if 语句,但您可以查看 Coalesce 运算符:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce
【讨论】:
创建客户端 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);
【讨论】:
if ($fork) $query->where('forkmaterial', '=', $fork) 之类的选项,这似乎可以很好地完成这项工作,而且它和我希望的一样干净。