在 MySQL 中更新记录时,Laravel 的 useCurrent() 不起作用

Posted

技术标签:

【中文标题】在 MySQL 中更新记录时,Laravel 的 useCurrent() 不起作用【英文标题】:Laravel's useCurrent() doesn't work when a record is updated in MySQL 【发布时间】:2021-01-01 08:40:23 【问题描述】:

我最近向我的数据库添加了一个新迁移,它以最简单的形式执行类似这样的操作

If(Schema::hasTable('some_table'))
    Schema::table('some_table', function (Blueprint $table) 
        $table->dateTime('last_updated')->nullable(false)->useCurrent()->change();
    );

根据 SE 上的this answer,Laravel 应该会自动为我创建和更新 last_record 列,但我正在 mysql 5.7.31 中对此进行测试,这对我来说绝对不是这种情况。我使用的是 Laravel 7.5,我的 php 版本是 7.3.21。

同时,手动将CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 添加到我的数据库也失败了。所以,这似乎是我的 MySQL 数据库而不是 Laravel 本身的问题。所以,我有两个问题:

是否有可能以某种方式使用 Laravel/PHP 在插入或更新时未传递任何内容时始终向字段添加默认值?

编辑:@lagbox 询问我如何保存/更新数据库中的记录。方法如下

$record= TableModel::where('blah', $blah)
                ->first();

if($record)
    $record->update([
         'blah1' => $blah1,
         'blah2' => $blah2
    ]);

【问题讨论】:

Eloquent 会自动处理 created_atupdated_at @lagbox 是的,但我的字段是last_updated,而不是updated_at。是否可以告诉 Eloquent 更改默认名称? 是的,如果您检查Illuminate\Database\Eloquent\Model,您将看到const UPDATED_AT = 'updated_at';,因此您可以根据需要在模型上定义它laravel.com/docs/7.x/eloquent#eloquent-model-conventions 模型约定-时间戳 @lagbox 谢谢。如果我遗漏了一些非常微不足道的东西,我很抱歉,但我在我的桌子模型中添加了const UPDATED_AT = 'last_updated';,但它仍然无法正常工作。 :| 你是如何保存/更新这条记录的? 【参考方案1】:

您可以覆盖 Eloquent 将自动处理的模型上用于 created_atupdated_at 时间戳的字段:

const UPDATED_AT = 'last_updated';

您还可以通过将const 设置为null 来禁用特定时间戳:

const CREATED_AT = null;

Laravel 7.x Docs - Eloquent - Model Conventions - TimestampsUPDATED_ATCREATED_AT

【讨论】:

以上是关于在 MySQL 中更新记录时,Laravel 的 useCurrent() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 更新记录 - 这是 2 个 MySQL 调用最有效的吗?

Laravel save() 正在更新错误的 mysql 记录

如何在更新 Laravel 中的记录时将表单发布数据加载到模型中

Laravel 5.5实时数据更新.

Laravel一次更新多个记录

Laravel 框架中的更新正在返回一条新记录