执行原始插入时,如何在 Laravel 5.1 中强制时间戳更新..在重复密钥更新时


How can I force a timestamp update in Laravel 5.1 when performing a raw INSERT ... ON DUPLICATE KEY UPDATE?

我使用 DB::statement($query, $params) 使用 INSERT ...关于重复键更新语法。但是,当我这样做时,"updated_at"或"created_at"字段都不会更新。我想知道是否有办法强制在原始查询中更新正确的字段?

上下文:我正在使用Laravel 5.1并使用$table->timestamps()功能创建了相关表。除了执行原始插入/更新外,我还使用 Eloquent 查询这些表,因此我无法实现禁用 Eloquent 自动更新的解决方案。

问题:目前我不清楚当 Eloquent 自动更新时间戳字段时如何生成时间 - 我假设它会参考数据库的参考时钟触发数据库中的自动更新?我想模仿Eloquent正在做的事情,这样我就不会使用两个不同的时钟作为来源

我对使用原始 MySQL 查询非常陌生,因此提前感谢人们能够提供的任何建议/见解!谢谢!

<?php
// use insertGetId method
    $id = DB::table('users')->insertGetId([]);
// and now update your table using where method
    DB::table('users')->update([
                             'created_at' => date('Y-m-d H:i:s'),
                             'updated_at' => date('Y-m-d H:i:s')
                       ])->where('id',$id);

我目前不清楚时间是如何产生的,当雄辩时 自动更新时间戳字段 - 我假设它会触发 参考数据库的引用自动更新数据库 时钟?

不。Laravel正在使用Carbon类,内部使用PHP DateTime类。您可以在save()方法的源代码中看到这一点。曲目: save() -> performInsert() -> updateTimestamps() -> freshTimestamp() -> new Carbon

我想模仿雄辩正在做的事情,以便我 不要以使用两个不同的时钟作为来源的时间结束。

您可以创建与 Eloquent 相同的时间戳:

$currentTimestamp = Carbon'Carbon::now()->toDateTimeString();

或者,如果您有任何Model实例:

$currentTimestamp = $model->freshTimestampString();

你可以用 Eloquent
做到这一点我想你已经有你的身份证

<?php
// $id your id
$object = Model::find($id);
// If is null you make insert row on your DB
if(null===$object) Model::create($inputs);
// If not null you make update row on your DB
else $object->fill($inputs)->save();

如果你喜欢这个雄辩的管理created_at和updated_at

在使用原始数据库查询时,我始终无法找到一种自动触发时间戳插入/更新的方法,因此我最终将它们硬编码到查询中。

我根据需要将created_at列添加到原始列列表中INSERT ... ON DUPLICATE KEY UPDATE列列表中。然后,我实现了一种方法来自动生成更新列值对,该值对以updated_at交换,而不是created_at作为给定时间值的列。