我有一个奇怪的场景,比如我给了四个日期,我需要根据这些日期调用一个方法。首先,我需要将启动时间的函数称为月份的第1个月,将结束时间称为月份的第15个月。再次需要调用此函数作为月份的第16个月的开始时间和月份的第30个/第31个月的结束日期。我可以使用硬编码值调用函数两次,但有没有更好的方法呢?
我正在使用Carbon库来创建PHP并创建像这样的日期
$this->firstDay = Carbon::now()->startOfMonth()->subMonth()>toDateString();
$this->lastDay = Carbon::now()->subMonth()->endOfMonth()>toDateString();
$this->firstHalf = Carbon::parse($this->firstDay)->addDays(15)->toDateString();
$this->secondStart = Carbon::parse($this->firstDay)->addDays(16)->toDateString();
我需要调用的方法有以下代码
return $this
->database
->table('table')
->selectRaw('SUM(points) AS points, id')
->whereBetween('date', [$firstDay, $firstHalf])
->groupBy('id')
->get();
这些将提供相应的日期,现在我需要将该方法作为firstDay
的开始时间和结束时间firstHalf
运行,然后再次以secondStart
开始时调用结束为lastDay
。基本上我要做的是通过两次写入查询来避免重复代码。
如何做到这一点?
答案 0 :(得分:0)
最好将变量设置为实际的Carbon
个实例。
考虑到28或29天的月份,您可以抓住上个月的最后一天并将其除以2以找到中间点。
$lastMonth = Carbon::now()->subMonth();
$start = $lastMonth->startOfMonth();
$end = $lastMonth->endOfMonth();
$middle = floor($end->days / 2);
$firstDay = $start->toDateString();
$firstHalf = $start->addDays($middle)->toDateString();
$lastDay = $end->toDateString();
$secondHalf = $start->addDays($middle + 1)->toDateString();
编辑:更新示例以反映更新后的问题中使用的变量
编辑2:
如果您正在使用Laravel / Eloquent,您甚至可以将实际的Carbon
实例直接传递给查询构建器,而无需调用toDateString()
。