Laravel 碳日期未在 Seeder 中修改

Laravel Carbon dates not getting modified in Seeder

在 Laravel 播种机中,我试图获取一个 Faker 生成的日期,将其转换为 Carbon,然后获取两个仅相隔几个小时的日期以表示一个 4 小时的会话.例如, Start Date: 03/13/2016 12:00PM
End Date: 03/13/2016 5:00PM

下面是我的结果,但是 $start$end 变量总是 相同。

            for ($k = 0; $k < $jobAssignmentCount; $k++) {
                $randomDate = $faker->dateTimeBetween($job->starts_at, '+6 months');
                $dateTime = Carbon::instance($randomDate)->minute(0)->second(0);
                $start = $dateTime;
                $end = $dateTime;
                $end->addHours(4);
                $jobAssignment = JobAssignment::create([
                    'job_id' => $job->id,
                    'starts_at' => $start,
                    'ends_at' => $end,
                    'assignment_notes' => 'Assignment Notes',
                    'is_cancelled' => $faker->boolean(10),
                    'cancelled_at' => $faker->dateTimeBetween('+6 months', '+1 year'),
                    'cancelled_by_profile_id' => $profile->id,
                    'is_billable' => $faker->boolean(75),
                ]);
            }

尝试这样做:$end = $end->addHours(4); 或先克隆它。

我认为这是因为 $start 和 $end 都引用了同一个 Carbon 对象。尝试创建两个不同的 $dateTime 对象 - $startDateTime 和 $endDateTime - 间隔几个小时并将它们分别引用到 $start 和 $end。

您正在将 $start$end 分配给同一对象 $dateTime。因为它们都是同一个对象,当你改变一个时,另一个也会改变。最简单的事情是克隆对象,然后 addHours() 到克隆:

$start = Carbon::instance($randomDate)->minute(0)->second(0);
$end = clone $start;
$end->addHours(4);

现在您应该有两个不同的对象,一个 $start 和一个 $end,时间间隔为 4 小时。