Yii2 TimestampBehavior工作不正确


Yii2 TimestampBehavior not working correctly

我使用的是最新版本的Yii框架(2.0.6)。我有表Post与PostModel和在我的模型中,我需要设置正确的created_atupdated_at属性。只要我创建新的帖子,两个值都设置为当前时间戳,但是当我更新这个帖子时,它也会将表中的两个属性更新为当前时间,即使只有updated_at应该更新,created_at应该保持不变。

use yii'behaviors'TimestampBehavior;
public function behaviors() {
    return [
        [
                'class' => TimestampBehavior::className(),
        ],
        [
                'class' => SluggableBehavior::className(),
                'attribute' => 'name',
        ],
    ]; 
}

这是另一个版本,但仍然不能工作:

public function behaviors()
{
    return [
        'timestamp' => [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                'yii'db'ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                'yii'db'ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
            ],
        ],
        [
            'class' => SluggableBehavior::className(),
            'attribute' => 'title',
        ],
    ];
}

我也使用MariaDB数据库。如果你能帮助我,我的代码是怎么回事,我将非常感激。

首先,第二个代码片段是不正确的,因为attributes数组不是由用户设置的。这是一种内部逻辑,你只需要设置createdAtAttributeupdatedAtAttribute属性。因此,它们默认被命名为created_atupdated_at,所以如果您的命名相同,您可以像在第一个代码片段中那样省略此声明。

最好也显式地添加这个:

use yii'db'Expression;
...
`value` => new Expression('NOW()'),

为了防止在更新过程中更改created_at列的值,可以添加DEFAULT CURRENT_TIMESTAMP

下面是来自migration的代码片段:

use yii'db'Schema;
...
'created_at' => Schema::TYPE_TIMESTAMP . ' NOT NULL DEFAULT CURRENT_TIMESTAMP',
'updated_at' => Schema::TYPE_TIMESTAMP . ' NOT NULL',

详情请参阅相关问题

这是MySQL,但我猜对于MariaDB是相同或非常相似的