2017-09-05 111 views
-2

的工作,我有下面的类与TimestampBehaviourTimestampBehavior不会因为验证失败

/** 
* @property int $id 
* @property string $name 
* @property int $created_at 
*/ 
class Workspace extends yii\db\ActiveRecord { 

    public static function tableName() { 
     return 'workspace'; 
    } 

    public function behaviors() { 
     return [ 
      [ 
       'class'  => TimestampBehavior::className(), 
       'attributes' => [ 
        ActiveRecord::EVENT_BEFORE_INSERT => 'created_at', 
        ActiveRecord::EVENT_BEFORE_UPDATE => false, 
       ], 
       'value' => date('Y-m-d H:i:s') 
      ], 
     ]; 
    } 
    ... 
} 

出于某种原因,该行为不填充属性。当我试图保存模型时,它总是空的($workspace->save())。自验证失败后,我无法保存它(“created_at不能为空”)。这个班没有什么特别的。什么都没有被覆盖。可能是什么问题呢?

回答

0

原来,验证规则造成了麻烦。意想不到的,因为我认为一切都是正确的。这些是我的规则:

public function rules() { 
    return [ 
     [['id', 'name', 'created_at'], 'required'], 
     [['id'], 'int'], 
     [['name'], 'string', 'max' => 100], 
     [['created_at' ], 'datetime'], 
    ]; 
} 

created_at切不可要求 - 这就是问题所在。

它甚至documented

由于属性值将被通过这种行为自动设置, 它们通常不是用户输入,并且因此不应被验证, 即created_at和的updated_at不应该出现在规则()方法 的模型。

$workspace->save()被执行时,第一步是验证。只有在该步骤之后,EVENT_BEFORE_INSERT/EVENT_BEFORE_UPDATE才会被触发,这会导致TimestampBehaviour填充指定的字段。只有验证成功时才会发生这种情况! (如果你var_dump,你确实会看到一个空的created_at。)太迟了,验证已经发生了,并且我有验证错误。

推荐的解决方案是从需要的规则中删除created_at。当然,其他方法也是可能的(例如,关闭验证或传递save()被调用时应验证的属性)。

0

添加行为像波纹管

public function behaviors() 
{ 
    return [ 
     [ 
      'class' => TimestampBehavior::className(), 
      'createdAtAttribute' => 'create_time', 
      'updatedAtAttribute' => 'update_time', 
      'value' => new Expression('NOW()'), 
     ], 
    ]; 
} 

,并在模型类添加到安全记录。

public function rules() 
{ 
    return array(
     array('create_time,update_time', 'safe'), 
    ); 
}