2015-06-27 2 views
1

Я скопировал следующий код с других сайтов и StackOverflow ответов (yii2 behaviors ActiveRecord::EVENT_BEFORE_INSERT not working) и не может заставить его работать:Yii2 Отметка Поведение возвращается 0000-00-00 00:00:00

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

Мои код модели заключается в следующем:

namespace app\models; 

use Yii; 

class Setting extends \yii\db\ActiveRecord 
{ 
    /* 
    * Autoupdate created_at and updated_at fields. 
    */ 

    public function behaviors() 
    { 
     return [ 
      'timestamp' => [ 
       'class' => \yii\behaviors\TimestampBehavior::className(), 
       'attributes' => [ 
        \yii\db\ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'], 
        \yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'], 
       ], 
       'value' => new \yii\db\Expression('NOW()'), 
      ], 
     ]; 
    } 
    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'settings'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['value'], 'required'], 
      [['value', 'reference', 'notes'], 'string'], 
      [['created_at', 'updated_at'], 'safe'], 
      [['property'], 'string', 'max' => 255] 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function attributeLabels() 
    { 
     return [ 
      'id' => 'ID', 
      'property' => 'Property', 
      'value' => 'Value', 
      'reference' => 'Reference', 
      'created_at' => 'Created At', 
      'updated_at' => 'Updated At', 
      'notes' => 'Notes', 
     ]; 
    } 

    /** 
    * Get a property 
    */ 
    public static function getSetting($property_name) 
    { 
     $setting = self::find()->where(['property' => $property_name])->one(); 
     if(is_null($setting)) 
      return NULL; 
     else 
      return $setting->value; 
    } 
} 

когда я создаю новый параметр, столбец created_at и updated_at установлен в 0000-00-00 00:00:00, но когда я затем обновить строку снова, updated_at работы. Похоже, что EVENT_BEFORE_INSERT не выполняется.

+1

Каков типа данных столбцов? –

+0

Временная метка, поэтому yyyy-mm-dd hh: mm: ss –

+0

Проверьте это с помощью функции 'CURRENT_TIMESTAMP()'. –

ответ

1

до более подходящего ответа не приходит, я достиг его с помощью beforeSave():

/* 
* Autoupdate created_at and updated_at fields. 
*/ 

public function beforeSave($insert) 
{ 
    if (parent::beforeSave($insert)) { 
     if($insert) 
     $this->created_at = date('Y-m-d H:i:s'); 
     $this->updated_at = date('Y-m-d H:i:s'); 
     return true; 
    } else { 
     return false; 
    } 
} 
1

Я имел точно такую ​​же проблему в MySQL. Проблема заключалась в том, что мой столбец базы данных для «created_at» был задан как тип данных метки времени. Я обнаружил, что вам нужно объявить столбец базы данных как int (11), чтобы он работал правильно.

+0

Итак, вы предлагаете сохранить дату как временную метку unix? –

+0

Да точно ... Он сохраняется как временная метка Unix. –

+0

Спасибо. Это полезно. В конце концов, я решил не использовать этот подход, потому что его легче искать в базе данных. –

0

Вы можете использовать для метода времени() в Yii2 с помощью следующего кода:

Yii::$app->formatter->asTimestamp(date('Y-d-m h:i:s'))