我对Laravel中的日期范围有疑问,这让我大吃一惊。最初,查询有效,没有错误,但是我检测到,如果日期范围在不同的年份之间(12-2020至01-2021),则它不会返回任何记录。我有点讨厌检查代码,但看不到问题所在。
我在这里放置了将数据保存在数组中的查询,以及稍后在返回值之前应用日期过滤器的检查。
public function getData($filters) {
$tasks = $this->getModel()
->whereIn('tasks.department_id', $filters['departmentIds'])
->join('departments', 'departments.id', '=', 'tasks.department_id')
->join('deliverables as dev', 'dev.id', '=', 'tasks.deliverable_id')
->leftJoin('deliverables as sub', 'sub.id', '=', 'tasks.subdeliverable_id')
->leftJoin('workers as st_workers', 'st_workers.id', '=', 'tasks.start_worker_id')
->leftJoin('workers as end_workers', 'end_workers.id', '=', 'tasks.end_worker_id')
->leftJoin('type_task_statuses', 'type_task_statuses.id', '=', 'tasks.status_id')
->leftJoin('incidences', 'incidences.task_id', '=', 'tasks.id')
->select('tasks.id', 'departments.name as department', 'tasks.start_worker_id', 'tasks.end_worker_id', 'st_workers.short_name as start_worker',
'end_workers.short_name as end_worker', 'tasks.plane', 'tasks.st', 'dev.name as deliverable', 'sub.name as subdeliverable',
'tasks.quantity', 'tasks.other_deliverable', 'tasks.start_prevision_date', 'tasks.end_prevision_date', 'tasks.start_date',
'tasks.end_date', 'tasks.prevision_hour', 'tasks.incurred_hour', 'type_task_statuses.display_name as status', 'type_task_statuses.color', 'tasks.advance', 'tasks.agreed',
'tasks.disagreed_date', 'tasks.supervised', DB::raw('COUNT(incidences.id) as count_incidences'))
->groupBy('tasks.id');
if (array_key_exists('fromDate', $filters) && $filters['fromDate']) {
$tasks->whereRaw('(DATE_FORMAT(tasks.end_date, "%m-%Y") >= "'.$filters['fromDate'].'" OR tasks.end_date is NULL)');
}
if (array_key_exists('toDate', $filters) && $filters['toDate']) {
$tasks->whereRaw('(DATE_FORMAT(tasks.end_date, "%m-%Y") <= "'.$filters['toDate'].'" OR tasks.end_date is NULL)');
}
return $tasks;
}
我建议您在应用程序中将输入的格式设置为日期范围,而不是在数据库端应用格式设置,请参阅另一种关于anit模式的答案
假设您有以下输入以匹配数据库中的日期
$filters['fromDate'] ='12-2020';
$filters['toDate'] = '01-2021';
实际等于以下日期范围
从2020-12-01 00:00:00到2021-01-31 23:59:59
因此,让我们尝试将过滤器输入转换为该范围格式
/** 2020-12-01 00:00:00 */
$fromDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-'.$filters['fromDate'])->startOfMonth()->format('Y-m-d H:i:s');
/** 2021-01-31 23:59:59 */
$toDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-'.$filters['toDate'])->endOfMonth()->format('Y-m-d H:i:s');
现在,您可以轻松地在查询中应用这些范围,并且在数据库方面,您不需要任何格式
if (array_key_exists('fromDate', $filters) && $filters['fromDate']) {
$fromDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-' . $filters['fromDate'])->startOfMonth()->format('Y-m-d H:i:s');
$tasks->where(function ($query) use ($fromDate) {
$query->whereNull('tasks.end_date')
->orWhere('tasks.end_date', '>=', $fromDate);
});
}
if (array_key_exists('toDate', $filters) && $filters['toDate']) {
$toDate = \Carbon\Carbon::createFromFormat('d-m-Y', '01-' . $filters['toDate'])->endOfMonth()->format('Y-m-d H:i:s');
$tasks->where(function ($query) use ($toDate) {
$query->whereNull('tasks.end_date')
->orWhere('tasks.end_date', '<=', $toDate);
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句