Laravel Query Builder选择空输入

时间:2015-08-05 08:28:03

标签: php mysql sql laravel

我正在使用Laravel 5.0构建一个可过滤的列表,但我遇到了问题。

我从HTML表单中获取过滤器参数并将它们传递给查询构建器,但是如果表单输入保持为空应该返回由其他过滤器过滤的表的所有行。

示例代码:

$collection = Model::withTrashed()
    ->where('attr1', 'LIKE', \Request::input('attr1', '%'))
    ->where('attr2', 'LIKE', \Request::input('attr2', '%'))
    ->where('attr3', 'LIKE', \Request::input('attr3', '%'))
    ->get();

这对我来说似乎是最正确的代码,但它不能按预期工作。你知道我的问题的一个很好的解决方案吗?我不想整合一个凌乱的开关/ case语句来证明存在并手动构建集合。 :(

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

似乎您的问题是您始终将过滤器传递给查询,并且只有在它们不为空时才应传递它们。

也许这样的事情对你有用:

$results = Model::withTrashed();
if (\Request::input('attr1')) {
    $results->where('attr1', 'LIKE', \Request::input('attr1', '%'));
}
if (\Request::input('attr2')) {
    $results->where('attr2', 'LIKE', \Request::input('attr2', '%'))
}
if (\Request::input('attr3')) {
    $results->where('attr3', 'LIKE', \Request::input('attr3', '%'))
}
$collection = $results->get();

答案 1 :(得分:1)

您需要稍微调整一下您的查询:

$collection = Model::withTrashed() ->where('attr1', 'LIKE', '%' . \Request::input('attr1') . '%') ->where('attr2', 'LIKE', '%' . \Request::input('attr2') . '%') ->where('attr3', 'LIKE', '%' . \Request::input('attr3') . '%') ->get();

这将确保在发送空输入参数时LIKE子句仍然正确。