Я скопировал следующий код с других веб-сайтов и ответы на stackoverflow ( поведение yii2 ActiveRecord :: EVENT_BEFORE_INSERT не работает ) и не может заставить его работать:
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 не выполняется.
Пока не появится более подходящий ответ, я достиг этого, используя beforeSave()
:
/* * Autoupdate created_at and updated_at fields. */ public function beforeSave($insert) { if (parent::beforeSave($insert)) { if($insert) $this->created_at = date('Ymd H:i:s'); $this->updated_at = date('Ymd H:i:s'); return true; } else { return false; } }
У меня была такая же проблема в MySQL. Проблема заключалась в том, что мой столбец базы данных для «created_at» был задан как тип данных метки времени. Я обнаружил, что вам нужно объявить столбец базы данных как int (11), чтобы он работал правильно.
Вы можете использовать метод time () в Yii2 через следующий код:
Yii::$app->formatter->asTimestamp(date('Ydm h:i:s'))