我有以下课程TimestampBehaviour:
/**
* @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 :(得分:1)
事实证明,验证规则引起了麻烦。出乎意料,因为我认为一切都是正确的。这些是我的规则:
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不应出现在rules()方法中 该模型。
执行$workspace->save()
时,第一步是验证。只有在该步骤之后,才会触发EVENT_BEFORE_INSERT / EVENT_BEFORE_UPDATE,这会导致TimestampBehaviour填充指定的字段。只有在验证成功的情况下才会发生这种情况! (如果你var_dump你确实会看到一个空的created_at。)太晚了,验证已经发生,我已经得到了验证错误。
推荐的解决方案是从必需的规则中删除created_at。当然,其他方法也是可能的(例如关闭验证或传递在调用save()时应该验证的属性。)
答案 1 :(得分: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'),
);
}