如何生成Lumen / Laravel中几个日期之间的独特年份列表

时间:2016-05-02 18:59:52

标签: mysql laravel eloquent lumen php-carbon

我在Lumen中创建 API ,我需要创建一个方法,在同一个表格中获得日期来自两个列 并返回在这些日期之间发生的任何年份,将它们全部作为单个数组返回。

例如,假设一个名为start_date的表列和另一个名为end_date

的表列
start_date | end_date          getAllYears() should return =>
                               [1983, 1984, 1985, 1986, 1987,
                               1999, 2000, 2001, 2002, 2003,
                               ..., 2016]
1999-05-09 | 2002-04-03
1983-03-12 | 1987-09-23
2001-02-12 | 2016-11-27

目前我有一种方法可以设法在其他类型的更具体的查询上执行此操作,这次尝试的主要问题是,由于我检索的SQL记录数量庞大,这样的方法导致我的请求每次都超时。

我的无效方法很少使用流明/ Laravel

public function getAllYears(){
    $dates = $this->model->select('data_ini', 'data_fim')->get();

    $results = [];

    foreach ($dates as $obj){
        $carbonBegin = Carbon::createFromDate($obj->data_ini->year);
        $carbonEnd   = Carbon::createFromDate($obj->data_fim->year);

        if($carbonEnd->year === 9999){
            $carbonEnd->year = date('Y');
        }

        $carbonEnd->year++;
        // Simple method that runs a DatePeriod method
        $dateRange = $this->helper->createDateRange($carbonBegin, $carbonEnd);

        $results = array_merge($results, $dateRange);
    }
    sort($results);
    $cleanYears = array_unique($results);

    if ($cleanYears == null)
        return response()->json(['error' => true, 'errorCode' => '1008', 'message' => "No years found!"]);
    else
        return response()->json(['error' => false, 'years' => $cleanYears]);
}

所以,问题是,我怎么能以更便宜的方式做到这一点,以便我的服务器不会在每个请求上超时?提前感谢您的帮助:)

注意:DB:raw是禁止的,因为我的TL禁止我在API的任何地方使用它

1 个答案:

答案 0 :(得分:0)

您似乎需要whereBetween

$between = DB::table('theTable')->whereBetween('data_ini', ["str_to_date('2011-05-06','%Y-%m-%d')", "str_to_date('2011-05-06','%Y-%m-%d')"])->get();

使用模型:

$between = $this->model->whereBetween('data_ini', ["str_to_date('2011-05-06','%Y-%m-%d')", "str_to_date('2011-05-06','%Y-%m-%d')"])->get();

在上面,我正在使用MySQL内置的str_to_date

希望这有帮助!