我正在重构我的应用程序以适当的MVC并将我的所有业务逻辑转移到我的模型。但是,在某种情况下,这会导致性能显着下降。
我的模型'用户'与模型'Log'有很多关系。我的用户模型中有一个函数可以在某个日期之间返回其日志。我过滤这样的集合:
public function getLogsBetweenDates($start, $end) {
$logs = $this->logs
->filter(function($value, $key) use ($start, $end) {
return $value->log_date >= $start && $value->log_date <= $end;
});
return $logs
}
这可以工作,但它比我之前在控制器中访问我的LogRepository的实现要慢很多。
public function getLogsBetweenDateFromUser($start_date, $end_date, $user_id)
{
$start = Carbon::parse($start_date);
$end = Carbon::parse($end_date);
return Log::where('user_id', $user_id)
->where('log_date', '>=' , $start)
->where('log_date', '<=' , $end)
->get();
}
这可能与Eloquent管理检索关系的方式有关。我想将代码保留在我的用户模型中,但不保留性能下降。有人知道这个性能下降的确切来源以及我如何解决这个问题吗?
答案 0 :(得分:1)
过滤集合意味着您从数据库中读取所有内容,为每条记录创建对象,然后进行过滤。它需要更多时间是正常的。无论架构如何,解决方案都是使用Eloquent过滤来实现第二种方式。