如何自定义Laravel whereBetween子句使上限无限制?

时间:2015-12-07 13:44:23

标签: php mysql laravel where laravel-query-builder

我一直在使用雄辩的查询构建器来开发laravel。我有一种情况,我根据搜索查询过滤记录。我有一个整数字段,我想要在范围内过滤数据。例如,用户可以选择任何可用范围;     0-1515-3030 and above。 为此我发现Query-builders whereBetween()子句非常有帮助。但是当我想选择30 and above时,对我来说最后一个选项变得困难。 我真的很感激,如果有人可以通过一些技巧来帮我解决这个问题

->whereBetween('time_taken', [$lower-limit,$uper_limt])

适用于所有情况。 我不想为这种情况写一个额外的行,我可以使用简单的where子句

->where('time_taken','>=',$uper_limt)

2 个答案:

答案 0 :(得分:4)

这里的实际解决方案是选择合适的SQL条件(我在这里使用三元运算符来保持它更紧凑):

$query = App\Operation::query();

(empty($upper_limit)) ? $query->where('time_taken','>=', $lower_limit)
                      : $query->whereBetween('time_taken', [$lower_limit, $upper_limit]);

$results = $query->get();

当然只有一行会很好:

$results = App\Operation::whereBetween('time_taken', [$lower_limit, $upper_limit])->get();

但在这种情况下,这是不可能的,除非你想扩展Laravel查询生成器并修改它处理作为值传递的范围内的空参数的方式。

编写干净简洁的代码是我们都努力实现的目标,但并不总是能够实现一线解决方案。所以我的建议是停止对这类事情进行固定(有时我自己做的事情),因为在某些情况下,这是一个失败的原因,最终会浪费时间。

答案 1 :(得分:1)

您可以尝试以下任何一项:

方法1:

->whereBetween('time_taken', [$lower-limit,ModelName::max('time_taken')])

方法2:

->whereBetween('time_taken', [$lower-limit,DB::table('table_name')->max('time_taken')]) 

方法3:

$max = ModelName::max('time_taken');
//or
$max = DB::table('table_name')->max('time_taken');
//then
->whereBetween('time_taken', [$lower-limit,$max]) 

max()会从您的共同作者列中返回最高值。