我有一个问题时,更新一个列在一个模型中有2个时间戳列,如果你更新一列,它也更新其他列出于某种原因,不仅如此,它总是-8小时。代码片段如下。
$punchIn = $user->punches()
->whereNotNull('start')
->whereNull('end')
->firstWhere('schedule_id', $schedule->id);
if($punchIn) {
// something is happening here during saving. it also updates the start column for some reason.
// this thing substracts 8 hours from the end column and updates the start column with it.
// I have been debugging this for 3 days now.
$punchIn->end = Carbon::now();
$punchIn->save(); // I also tried the other way to update, but still same thing.
$punchIn->refresh(); // this has the new value of start and end.
}
这是迁移文件:
Schema::create('user_punches', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->foreignId('schedule_id')->constrained('schedules')->cascadeOnDelete();
$table->timestamp('start')->nullable(); // overrides
$table->timestamp('end')->nullable(); // overrides
$table->timestamps();
});
这就是用户雄辩的关系:
class User extends Authenticatable implements MustVerifyEmail {
use HasApiTokens, HasFactory, Notifiable, HasRoles;
public function punches()
{
return $this->hasMany(UserPunch::class);
}
}
用户打孔模型:
class UserPunch extends Model {
use HasFactory;
protected $fillable = [
'schedule_id',
'start',
'end',
];
public function user()
{
return $this->belongsTo(User::class);
}
}
我已经在这个问题上好几天了。我在这里尝试过其他类似的案例,比如问题可能是Mysql的时间戳,如果不为空,但问题仍然存在。
有人能给我指出正确的方向吗?我真的很感激任何关于这个的解释。现在,我坚持这个。我的最后一个选择是使用datetime
而不是timestamp
,但这将意味着我会追溯到长代码和所有我试图避免的关系。
1条答案
按热度按时间y4ekin9u1#
天啊。我想出来了。
很明显,默认情况下它被设置为更新到
CURRENT_TIMESTAMP
。我拥有的迁移文件已经是它的解决方案,但当我从有问题的生产数据库的转储文件恢复时被覆盖。这两个问题的答案在这里,确实给了我这个问题的启示。我将它粘贴在这里,以供参考,以防其他人偶然发现这一点。
Laravel 6 - Updating the model timestamps
Laravel Timestamp Being Updated Without Explicit Call To Do So
经验教训:处理
timestamps
时,始终将其设置为nullable