2014-11-23 3 views
2

Моя функция поведения в моей модели заключается в следующем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. В чем проблема?

ответ

8

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

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()'), 
     ], 
    ]; 
} 
+0

Просто любопытен, почему бы вам обновить время входа в системе, когда вы выполняете обновление? Приложение по умолчанию показывает вам, как его обновлять при входе в систему. –

+0

У меня нет функции beforeSave() – user7282

+0

На самом деле я ошибаюсь, вы должны иметь возможность комбинировать 2 просто отлично, как и вы. Я не знаю, почему это происходит. –

Смежные вопросы