如何使用sql查询优化代码
$collection->filter(function ($item) use ($i) {
return $item->created_at->month == $i->month;
})->count();
我想用sql来代替集合上的filter函数,这样可以更快
函数如下:
$data = [];
switch ($range) {
//monthly
case self::$timeRanges[0]:
for ($i = Carbon::now()->copy()->subYear()->endOfMonth(); $i <= Carbon::now()->subMonth()->endOfMonth(); $i->addMonths(1)) {
$data[$i->month] = $collection->filter(function ($item) use ($i) {
return $item->created_at->month == $i->month;
})->count();
}
break;
//weekly
case self::$timeRanges[1]:
$collection = $collection->where('created_at', '>=', Carbon::now()->subWeek()->endOfWeek()->subWeeks(5))->where('created_at', '<=', Carbon::now()->subWeek()->endOfWeek());
for ($i = Carbon::now()->copy()->subWeek()->endOfWeek()->subWeeks(5); $i <= Carbon::now()->copy()->subWeek()->endOfWeek(); $i->addWeeks(1)) {
$data[$i->weekOfMonth] = $collection->filter(function ($item) use ($i) {
return $item->created_at->weekOfYear == $i->weekOfYear;
})->count();
}
break;
}
return ($data);
谢谢你的帮助,祝你有愉快的一天!
2条答案
按热度按时间smdncfj31#
试试这个:
k4emjkb12#
为了扩展@elie的答案,您甚至不需要使用原始查询。laravel完美地满足了日期条件,在查询页面上有很好的文档记录。
然而,这并不能完全回答眼前的问题。我们需要做的是检索所有相关的结果,然后按月对检索到的结果进行过滤。我相信,通过从sql中检索所有结果,然后按原样对其进行筛选,这样做会更高效、更快,但迭代代码更少:
另外,如果您坚持使用sql进行过滤,您可以
groupBy
:你需要做你自己的测试,哪一个更快或至少是最有效的。另外,有些数据库不允许在不修改其配置的情况下进行多个分组(我们这里没有,但您可能需要添加),因此我个人的第一名将是原始方法,除非您使用的是大量数据集。