我的模型中的行为功能如下
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
。问题是什么?
答案 0 :(得分:10)
你是否有机会在特定模型中覆盖之前保存(或者插入前或更新前)?如果你这样做,你必须打电话给
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()'),
],
];
}
或者您可以尝试在TimestampBehavior中将createdAtAttribute和$ updatedAtAttribute设置为'log_in_time',这也应该有效。
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()'),
],
];
}