2014-11-02 53 views
2
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'], 
      ], 
     ], 
    ]; 
} 

上面的代码用于我的控制器行为功能。在创建或更新时,'create_time'和'update_time'字段没有按当前时间更新。这些字段的类型设置为日期时间。请你需要你的帮助。TimestampBehavior在Yii2中不工作

+0

编写规则 – zelenin 2014-11-03 08:06:24

回答

2

你必须声明它在模型中的行为方式。

要使用TimestampBehavior,下面的代码插入到你的ActiveRecord类

public function behaviors() 
{ 
    return [ 
    'class' => TimestampBehavior::className(), 
     'attributes' => [ 
      ActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'], 
      ActiveRecord::EVENT_BEFORE_UPDATE => ['update_time'], 
    ], 
    ]; 
} 
+0

我有同样的问题。我在模型类中有行为。他们似乎工作,但时间总是设置为epoch(“0000-00-00 00:00:00”)每次 – iGbanam 2015-02-16 16:15:13

+1

这是因为您的列在数据库中是DATETIME类型。将它更改为INTEGER(11),它将起作用;) – 2015-02-19 11:11:43

+1

Mine设置为TIMESTAMP,但也设置为“0000-00-00 00:00:00:00”。设置为“INT(11)”将其设置为“0”。 – 2015-06-27 11:05:51

2

试试这个,它为我工作:

use yii\db\Expression; 
... 

     [ 
      'class' => TimestampBehavior::className(), 
      'updatedAtAttribute' => 'update_time', 
      'value' => new Expression('NOW()'), 
     ], 
+0

但我认为这将只为MySQL工作。任何其他RDBMS可能会标记错误。这是Yii2的开发者应该考虑的事情。 – iGbanam 2015-02-16 16:14:06

+1

一次又一次为什么人们使用int字段来存储时间戳这样一个坏主意。 – AndrewMcLagan 2015-04-19 07:11:45

+0

@AndrewMcLagan为什么不呢?它是unix的时间,所以你可以将它转换为可读的日期时间。加上它适用于时区 – 2015-05-14 17:02:23

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()'), 
     ], 
    ]; 
} 
0

您还可以使用

'value' => date('Y-m-d H:i:s') 

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

0

我用new Expression('NOW()')来存储当前的时间戳。但它不存储基于当前时区的日期。而是根据服务器时间进行存储。

我只是使用正常的php日期函数来解决这个问题。

如:

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'), 
     ], 
    ]; 
}