时间戳行为在Yii2中不起作用

时间戳行为在Yii2中不起作用,yii2,Yii2,以上代码用于我的控制器行为函数。创建或更新时,“创建时间”和“更新时间”字段不会按当前时间更新。这些字段的类型设置为datetime。请您帮忙。试试这个,它对我有用: public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'd

以上代码用于我的控制器行为函数。创建或更新时,“创建时间”和“更新时间”字段不会按当前时间更新。这些字段的类型设置为datetime。请您帮忙。

试试这个,它对我有用:

public function behaviors()
{
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'delete' => ['post'],
            ],
        ],

        'access' => [
            'class' => AccessControl::className(),
            'only' => ['create', 'update', 'delete', 'view', 'index'],
            'rules' => [
                // allow authenticated users
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
                // everything else is denied by default
            ],
        ],

        [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['update_time'],
            ],
        ],
    ];
}

您必须在模型的行为方法中声明它

要使用TimestampBehavior,请向ActiveRecord类插入以下代码


还必须添加值并使用类表达式

public function behaviors()
{
  return [
    'class' => TimestampBehavior::className(),
        'attributes' => [
           ActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'],
           ActiveRecord::EVENT_BEFORE_UPDATE => ['update_time'],
    ],
  ];
}
你也可以使用

use yii\behaviors\TimestampBehavior;
use yii\db\Expression;

public function behaviors()
{
    return [
        'timestamp' => [
            'class' => 'yii\behaviors\TimestampBehavior',
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
            ],
            'value' => new Expression('NOW()'),
        ],
    ];
}

如果您想使用PHP日期时间。

我使用了
新表达式('NOW()')
来存储当前时间戳。但它不会根据当前时区存储日期。相反,它基于服务器时间进行存储

我只是用普通的php日期函数来解决这个问题

例如:


但我认为这只适用于MySQL。任何其他RDBMS都可能标记错误。这是Yii2开发人员应该考虑的问题。为什么人们一次又一次地使用int字段来存储时间戳?这是个糟糕的主意。@AndrewMcLagan为什么不呢?这是unix时间,因此您可以将其转换为可读的日期时间。此外,它还可以与时区配合使用。在SQL中计算SQL dat字段的速度更快,在PHP中有许多本机方法来操作SQL日期字段,默认情况下使用诸如SQL日期格式之类的库。SQL时间戳隐式地将数据存储在GMT时区中。无论您的会话时区是什么。如果你需要使用不同的时区,这很有用。我有同样的问题。我有模型课上的行为。它们似乎可以工作,但每次都将时间设置为epoch(“0000-00-00 00:00:00”),这是因为您的列在数据库中是DATETIME类型。将其更改为整数(11),它将工作;)我的设置为时间戳,但也设置为
0000-00-00 00:00:00
。设置为
INT(11)
只需将其设置为
0
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;

public function behaviors()
{
    return [
        'timestamp' => [
            'class' => 'yii\behaviors\TimestampBehavior',
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
            ],
            'value' => new Expression('NOW()'),
        ],
    ];
}
 'value' => date('Y-m-d H:i:s')
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;

public function behaviors()
{
    return [
        'timestamp' => [
            'class' => 'yii\behaviors\TimestampBehavior',
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
            ],
            'value' => date('Y-m-d H:i:s'),
        ],
    ];
}