You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel更新模型时意外修改另一timestamp列且时差8小时求助

Laravel timestamp字段更新异常排查方向

在Laravel开发中,更新包含两个timestamp字段的UserPunch模型的end字段时,start字段会被意外修改,且修改后的时间比当前时间少8小时。暂不想将timestamp替换为datetime类型,以下是相关代码文件,寻求问题排查方向:

问题代码片段

$punchIn = $user->punches()
      ->whereNotNull('start')
      ->whereNull('end')
      ->firstWhere('schedule_id', $schedule->id);

if($punchIn) {
      $punchIn->end = Carbon::now();
      $punchIn->save();
      $punchIn->refresh();
}

迁移文件

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();
    $table->timestamp('end')->nullable();
    $table->timestamps();
});

User模型关联

class User extends Authenticatable implements MustVerifyEmail {
    use HasApiTokens, HasFactory, Notifiable, HasRoles;

    public function punches()
    {
        return $this->hasMany(UserPunch::class);
    }
}

UserPunch模型

class UserPunch extends Model {
    use HasFactory;

    protected $fillable = [
        'schedule_id',
        'start',
        'end',
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

排查方向

  • 检查数据库与Laravel的时区匹配:确认MySQL的time_zone配置,和Laravel config/app.php中的timezone是否一致,8小时差通常是时区不匹配(如MySQL用UTC,Laravel用东八区)导致。
  • 验证Carbon实例的时区:将Carbon::now()替换为Carbon::now()->utc()或DB::raw('CURRENT_TIMESTAMP')测试,看时间偏移是否消失。
  • 显式声明模型字段类型:在UserPunch模型中添加protected $casts = ['start' => 'datetime', 'end' => 'datetime'];,避免Laravel自动转换时出现异常。
  • 查看实际执行的SQL:开启Laravel查询日志,打印更新时的SQL语句,确认是否意外包含了start字段的更新操作。
  • 检查数据库字段默认值:确认数据库中start字段是否设置了CURRENT_TIMESTAMP默认值,导致更新时被自动填充。
  • 排查全局观察者/事件:检查是否存在针对UserPunch模型的全局观察者、事件监听器,在更新时修改了start字段的值。

内容的提问来源于stack exchange,提问作者Jovanni G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:15:25