yii2行为ActiveRecord :: EVENT_BEFORE_INSERT不起作用

时间:2014-11-23 05:38:14

标签: activerecord yii2

我的模型中的行为功能如下

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_timeDATETIME。插入的值是0000-00-00 00:00:00。问题是什么?

1 个答案:

答案 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()'),
        ],
    ];
}