【问题标题】:How does Yii timestamps work?Yii 时间戳是如何工作的?
【发布时间】:2015-07-23 20:44:39
【问题描述】:

Yii 说它可以自动设置时间戳'created_at':http://www.yiiframework.com/doc-2.0/guide-concept-behaviors.html#using-timestampbehavior

但是,每次我创建一个记录,时间都是空白的:

$ yii kw/test
1437683634

mysql> select * from ad_group_keyword_network where ad_group_keyword_id = 1;
+---------------------+-
| created_at          | 
+---------------------+-
| 0000-00-00 00:00:00 | 
| 0000-00-00 00:00:00 | 
+---------------------+-

  public function actionTest() {
    $agkn = new AdGroupKeywordNetwork();
    $agkn->save();
    echo $agkn->created_at;

我尝试使用 Schema::TYPE_TIMESTAMP 并更改了字段并尝试使用 Schema::TYPE_DATETIME。保存后都在字段中返回整数时间戳,但数据库中时间全为0。

public function behaviors()
{
    return [
        [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'],
                ActiveRecord::EVENT_BEFORE_UPDATE => [],

【问题讨论】:

  • yii timstamps 是 unix 时间戳,您正试图将这些整数填充到 mysql 日期字段中,该字段需要 yyyy-mm-dd hh:mm:ss 形式的字符串。由于您的整数不是该格式,因此您会得到全零日期,即“未知/无效”日期。
  • @MarcB 好的。我希望 Yii 会根据字段的类型进行转换。它从未提及所需的类型。猜猜它仍然必须赶上 Rails。

标签: php yii yii2


【解决方案1】:

你的created_at 必须是 INT (11) 类型,以便 Yii 2 时间戳行为工作。我认为您使用的 TIMESTAMP 类型不起作用。

【讨论】:

    【解决方案2】:

    根据 Marc 和 Michael 所说,我使用了它并且它有效。

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => null,
                'value' => function(){return date(DATE_ATOM);},
    

    $ yii kw/test
    2015-07-23T16:59:17-04:00
    ...
    +---------------------+
    | created_at          |
    +---------------------+
    | 2015-07-23 16:59:17 |
    

    【讨论】:

      【解决方案3】:

      $value 是将用于生成时间戳的表达式,默认情况下它将使用 time() 的值,除非您为其分配一个返回时间戳值的匿名函数:

      'timestamp' => [
          'class' => TimestampBehavior::className(),
          'attributes' => [
              ActiveRecord::EVENT_BEFORE_INSERT => 'created_at',
              ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_at',
          ],
          'value' => function() { return date('U'); },
      ],
      

      或者一个表示数据库表达式的 yii\db\Expression 对象:

      'timestamp' => [
          'class' => TimestampBehavior::className(),
          'attributes' => [
              ActiveRecord::EVENT_BEFORE_INSERT => 'created_at',
              ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_at',
          ],
          'value' => new \yii\db\Expression('NOW()'), // MySql exp
      ],
      

      【讨论】:

        猜你喜欢
        • 2011-09-04
        • 2018-03-31
        • 1970-01-01
        • 2020-02-11
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多