【发布时间】:2019-10-10 11:57:14
【问题描述】:
MYSQL 为特定字段创建一个 updated_at 列。
我可以为特定列创建一个 updated_at(timestamp) 列吗 当我更改特定列时,必须更改 updated_at 列
【问题讨论】:
-
这已经是默认行为了......
-
您必须尝试创建触发器。
MYSQL 为特定字段创建一个 updated_at 列。
我可以为特定列创建一个 updated_at(timestamp) 列吗 当我更改特定列时,必须更改 updated_at 列
【问题讨论】:
创建一个将监视表上的任何更新的触发器
然后检查 if 子句中的列更改
CREATE TRIGGER update_date BEFORE UPDATE ON myTable
FOR EACH ROW
BEGIN
IF NEW.column1 <=> OLD.column1 THEN
SET new.updated_at = NOW()
END IF;
END;
【讨论】:
您需要创建 Mysql 触发器才能完成此操作。如果您打算从迁移中执行此操作,这里有一个示例代码,您必须使用您的表:
public function up()
{
DB::unprepared('
CREATE TRIGGER tr_User_Name_Update AFTER UPDATE ON `users` FOR EACH ROW
BEGIN
IF NEW.column1 <=> OLD.column1 THEN
-- RUN YOUR LOGIC HERE--
END IF;
END
');
}
public function down()
{
DB::unprepared('DROP TRIGGER `tr_User_Name_Update`');
}
我希望这将帮助您开始。
【讨论】:
在您的模型中,您可以覆盖 updateTimestamps() 方法(在 Illuminate\Database\Eloquent\Concerns\HasTimestamps 特征中)。
我会这样做:
在您的数据库表中有一个额外的datetime 字段。假设您要跟踪name 列,我将有一个名为name_updated_at 的datetime 字段。
在你的模型中使用这个方法:
protected function updateTimestamps()
{
// update the timestamp fields as usual
parent::updateTimestamps();
// if the name column has changed, then update the
// name_updated_at field too
if ($this->isDirty('name') {
$this->name_updated_at = $this->freshTimestamp();
}
return $this;
}
该函数在模型的save() 方法中调用(好的,通过performInsert() 和performUpdate() 调用。
这可以避免在 MySQL 中包含应用程序代码并将其保留在您的应用程序中。
【讨论】: