与存储库访问相比,Laravel集合过滤速度较慢

时间:2016-04-24 05:34:32

标签: laravel

我正在重构我的应用程序以适当的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管理检索关系的方式有关。我想将代码保留在我的用户模型中,但不保留性能下降。有人知道这个性能下降的确切来源以及我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

过滤集合意味着您从数据库中读取所有内容,为每条记录创建对象,然后进行过滤。它需要更多时间是正常的。无论架构如何,解决方案都是使用Eloquent过滤来实现第二种方式。