Yii2 Timestamp Behavior возвращает 0000-00-00 00:00:00

Я скопировал следующий код с других веб-сайтов и ответов 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 не выполняется.


person Stefan Dunn    schedule 27.06.2015    source источник
comment
Каковы типы данных столбцов?   -  person Ejaz Karim    schedule 28.06.2015
comment
Отметка времени, т.е. гггг-мм-дд чч:мм:сс   -  person Stefan Dunn    schedule 28.06.2015
comment
Проверьте это с помощью функции CURRENT_TIMESTAMP().   -  person Ejaz Karim    schedule 29.06.2015


Ответы (3)


Пока не появится более подходящий ответ, я достиг его, используя 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;
   }
}
person Stefan Dunn    schedule 27.06.2015

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

person Luke James    schedule 07.12.2015
comment
Итак, вы предлагаете сохранить дату как временную метку unix? - person Stefan Dunn; 08.12.2015
comment
Да, именно... Он сохраняется как временная метка Unix. - person Luke James; 09.12.2015
comment
Спасибо. Это полезно. В конце концов я решил не использовать этот подход, потому что его проще искать в базе данных. - person Stefan Dunn; 10.12.2015

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

Yii::$app->formatter->asTimestamp(date('Y-d-m h:i:s'))
person Mahmut Aydın    schedule 16.05.2016