我正在 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 上的任何地方使用它
看起来您需要 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();
str_to_date
希望这有帮助!