2

我一直在使用雄辩的查询构建器来开发 laravel。我有一种情况,我正在根据搜索查询过滤记录。我有一个整数字段,我想过滤范围内的数据。例如,用户可以选择任何可用范围; 0-15,15-3030 and above. 为此,我发现查询构建器 whereBetween() 子句非常有帮助。但是当我想选择30 and above. 如果有人可以帮助我做这个查询,我将不胜感激

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

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

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

4

2 回答 2

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 查询构建器并修改它处理作为值传递的范围内的空参数的方式。


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

于 2015-12-07T16:18:13.207 回答
1

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

方法一:

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

方法二:

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

方法三:

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

max()返回您的共同受访者列中的最大值。

于 2015-12-07T17:13:11.240 回答