我在数据库中创建了这样的表。
Schema::create('packages', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('count');
$table->timestamp('expire_date');
$table->timestamps();
});
现在假设我们在数据库中有以下记录:
+----+-------+---------------------+---------------------+---------------------+
| id | count | expire_date | created_at | updated_at |
+----+-------+---------------------+---------------------+---------------------+
| 1 | 120 | 2018-01-31 19:22:45 | 2018-01-29 17:12:01 | 2018-01-29 19:22:45 |
| 4 | 140 | 2018-02-14 19:05:01 | 2018-01-29 17:20:16 | 2018-01-29 19:05:01 |
| 27 | 10 | 2018-02-17 19:01:10 | 2018-01-29 19:05:01 | 2018-01-29 19:05:01 |
+----+-------+---------------------+---------------------+---------------------+
当我尝试使用 laravel 雄辩编辑记录时:
$package = AppPackage::find(1);
$package->count = 100;
$package->save();
保存方法将expire_date和updated_at列更改为当前时间!
+----+-------+---------------------+---------------------+---------------------+
| id | count | expire_date | created_at | updated_at |
+----+-------+---------------------+---------------------+---------------------+
| 1 | 100 | 2018-01-29 19:32:24 | 2018-01-29 17:12:01 | 2018-01-29 19:32:24 |
| 4 | 140 | 2018-02-14 19:05:01 | 2018-01-29 17:20:16 | 2018-01-29 19:05:01 |
| 27 | 10 | 2018-02-17 19:01:10 | 2018-01-29 19:05:01 | 2018-01-29 19:05:01 |
+----+-------+---------------------+---------------------+---------------------+
为什么expire_date价值甚至没有触及它就改变了?!!!
看看你的表格DDL,它会是
expire_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
expire_date
默认值为当前时间戳。
您需要做的就是将ON UPDATE CURRENT_TIMESTAMP
更改为 null。
ALTER TABLE table ALTER COLUMN expire_date DEFAULT NULL
或在创建之前:
https://github.com/laravel/framework/blob/be09eac00a2f750dc2d2209078cf61ae2eee85a1/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php#L647
https://github.com/laravel/framework/blob/d598a6630208b054376527e41848c106f4297b2b/src/Illuminate/Database/Schema/ColumnDefinition.php#L26
$table->timestamp('expire_date')->useCurrent(false);
从文档中:
save
方法还可用于更新数据库中已存在的模型。若要更新模型,应检索它,设置要更新的任何属性,然后调用 save 方法。同样,updated_at
时间戳将自动更新,因此无需手动设置其值
因此,雄辩仅更新updated_at
。如果expire_date
也更新了,则意味着应用程序中使用了 Eloquent 事件或正在发生类似的事情(例如数据库更新它(。