我一直在使用雄辩的查询构建器来开发laravel。我有一种情况,我根据搜索查询过滤记录。我有一个整数字段,我想要在范围内过滤数据。例如,用户可以选择任何可用范围;
0-15
,15-30
和30 and above
。
为此我发现Query-builders whereBetween()子句非常有帮助。但是当我想选择30 and above
时,对我来说最后一个选项变得困难。
我真的很感激,如果有人可以通过一些技巧来帮我解决这个问题
->whereBetween('time_taken', [$lower-limit,$uper_limt])
适用于所有情况。 我不想为这种情况写一个额外的行,我可以使用简单的where子句
->where('time_taken','>=',$uper_limt)
。
答案 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()
会从您的共同作者列中返回最高值。