如何在 Lumen/Laravel 中生成多个日期之间的唯一年份列表

问题描述 投票:0回答:1

我正在 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 记录数量巨大,这样的方法会导致我的请求每次都超时。

我的低效方法很少使用Lumen/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 上的任何地方使用它

php laravel eloquent lumen php-carbon
1个回答
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

希望这有帮助!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.