Поведение yii2 ActiveRecord::EVENT_BEFORE_INSERT не работает

Моя функция поведения в моей модели выглядит следующим образом

public function behaviors()
    {
        return [
        'timestamp' => [
        'class' => 'yii\behaviors\TimestampBehavior',
        'attributes' => [
        ActiveRecord::EVENT_BEFORE_INSERT => ['log_in_time' ],
        ActiveRecord::EVENT_BEFORE_UPDATE => ['log_in_time'],
        ],
        'value' => new Expression('NOW()'),
        ],
        ];
    }
/**
     * validation rules
     */

public function rules()
{
    return [

            ['username','filter', 'filter' => 'trim'],
            ['username','required'],
            //['username','unique'],
            ['username','string', 'min' => 2, 'max' => 255],
            ['password','required'],

        ];
    }

/* Your model attribute labels */
public function attributeLabels()
{
    return [
    /* Your other attribute labels */
    ];
}

public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios['login'] = ['username','log_in_time'];//Scenario Values Only Accepted
        return $scenarios;
    }

Но он не обновляет столбец log_in_time. log_in_time это DATETIME . Вставляемое значение равно 0000-00-00 00:00:00. В чем проблема?


person user7282    schedule 23.11.2014    source источник


Ответы (1)


Вы случайно не перезаписываете перед сохранением (или перед вставкой или перед обновлением) в этой конкретной модели? Если вы это сделаете, вам нужно вызвать что-то вроде

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        ............
        return true;
    }
    return false;
}

Недавно я сделал что-то подобное и потратил некоторое время на изучение этого только для того, чтобы понять, что я не вызывал родителя перед сохранением.

Если вы используете AttributeBehavior вместо TimestampBehavior и делаете именно то, что делали, я думаю, это сработает.

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

Или вы можете попробовать установить для createdAtAttribute и $updatedAtAttribute значение «log_in_time» в TimestampBehavior, это также должно работать.

     public function behaviors()
            {
                return [
                'timestamp' => [
                'class' => 'yii\behaviors\TimestampBehavior',
'createdAtAttribute' =>  'log_in_time',
'updatedAtAttribute' =>  'log_in_time',
                ],
                ];
            }

Я не уверен, почему это не работает, как вы написали.

Это работает для меня на 100%

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        'blameable' => [
            'class' => BlameableBehavior::className(),
            'attributes' => [
                BaseActiveRecord::EVENT_BEFORE_INSERT => ['create_by', 'update_by'],
                BaseActiveRecord::EVENT_BEFORE_UPDATE => 'update_by'
            ],                
        ],
        'timestamp' => [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                BaseActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'],
                BaseActiveRecord::EVENT_BEFORE_UPDATE => 'update_time',
            ],
            'value' => new Expression('NOW()'),
        ],
    ];
} 
person Mihai P.    schedule 23.11.2014
comment
Просто любопытно, зачем вам обновлять время входа в систему при выполнении обновления? Приложение по умолчанию показывает, как обновить его при входе в систему. - person Mihai P.; 23.11.2014
comment
У меня нет функции beforeSave() - person user7282; 23.11.2014
comment
На самом деле я ошибаюсь, вы должны быть в состоянии совместить 2, как и вы. Я не уверен, почему это происходит. - person Mihai P.; 23.11.2014
comment
Я не понял. Можете ли вы опубликовать ответ как поведение () для большей ясности? - person user7282; 23.11.2014
comment
попробуйте примеры выше - person Mihai P.; 23.11.2014
comment
выложи всю модель пожалуйста. - person Mihai P.; 23.11.2014
comment
я добавил правила и сценарии, этого достаточно? - person user7282; 23.11.2014
comment
Я добавил то, что работает для меня на 100%. Я копирую вставленный из моего кода. Попробуйте это, но я считаю, что у вас есть другие проблемы с кодом, который вы не показали. - person Mihai P.; 23.11.2014
comment
В чем проблема в итоге? - person Mihai P.; 24.11.2014
comment
Я инициализировал переменную с тем же именем, $log_in_time внутри класса - person user7282; 25.11.2014
comment
Я не могу заставить ваш код работать, можете ли вы увидеть мой вопрос здесь: stackoverflow.com/questions/31088210/ - person Stefan Dunn; 27.06.2015