Laravel保存更新另一个时间戳列

t40tm48m  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一个问题时,更新一个列在一个模型中有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,但这将意味着我会追溯到长代码和所有我试图避免的关系。

y4ekin9u

y4ekin9u1#

天啊。我想出来了。

很明显,默认情况下它被设置为更新到CURRENT_TIMESTAMP。我拥有的迁移文件已经是它的解决方案,但当我从有问题的生产数据库的转储文件恢复时被覆盖。
这两个问题的答案在这里,确实给了我这个问题的启示。我将它粘贴在这里,以供参考,以防其他人偶然发现这一点。
Laravel 6 - Updating the model timestamps
Laravel Timestamp Being Updated Without Explicit Call To Do So
经验教训:处理timestamps时,始终将其设置为nullable

相关问题