Laravel哪里有关于对象的条款?

时间:2014-10-21 13:39:22

标签: php laravel eloquent

我的数据库中有400万行,我需要按时间过滤,因为你们都可以猜到问题与速度有关。

我目前正在使用remember函数来缓存我的查询。但我有一些确切的查询,我的用户可以选择。我的意思是:

  • 去年的所有数据
  • 6个月的所有数据
  • 上个月的所有数据
  • 上周的所有数据

这意味着我有4个缓存查询...如果您运行没有缓存的查询,所有查询都需要大约30秒。

我想要的是在收到所有数据一次后对其进行过滤并缓存它。

这样我就可以使用所有数据来过滤我想要的内容。

使用一些代码更清楚一点:

<?php

if (Cache::has('alldata')) {
    $alldata = Cache::get('alldata');
} else {
    $alldata = Data::all();
}

// Filters
$alldata->where('activity', '=', 1)->get();

// The code i currently use for every filter
$lastYearData = Data::where('column', '=', 'filter')->get();
// The line above "4 times" for each filter

?>

2 个答案:

答案 0 :(得分:1)

where()方法将调用SQL所在的函数。获得结果后,您无法使用它。所以你必须用PHP过滤:

$lastYearData = array_filter($alldata, function ($value) {
    return $value['date']->diffInDays() <= 365;
});

答案 1 :(得分:0)

PHP上的'缓存'将无法正常工作,因为一旦处理完请求,它就会被清除。

使用正确的表索引,您的查询不应该花费那么多时间。 此外,MySQL会进行缓存,因此您不必在PHP端实现缓存,除非您的查询的WHERE条件发生了很大变化。

尝试连续两次在MySQL命令行上运行30秒查询。您会注意到第二次运行将比第一次运行更快地返回。