yii2行为ActiveRecord :: EVENT_BEFORE_INSERT不起作用

use*_*282 3 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;
    }
Run Code Online (Sandbox Code Playgroud)

但它没有更新log_in_time专栏.log_in_timeDATETIME.插入的值0000-00-00 00:00:00是.问题是什么?

Mih*_* P. 11

你有没有机会在特定模型中覆盖之前保存(或者插入或者更新之前)?如果你这样做,你必须打电话

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        ............
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我最近做了类似的事情,并花了一些时间研究这个只是为了意识到我在保存之前没有给父母打电话.

如果您使用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()'),
        ],
        ];
    }
Run Code Online (Sandbox Code Playgroud)

或者您可以尝试在TimestampBehavior中将createdAtAttribute和$ updatedAtAttribute设置为'log_in_time',这也应该有效.

     public function behaviors()
            {
                return [
                'timestamp' => [
                'class' => 'yii\behaviors\TimestampBehavior',
'createdAtAttribute' =>  'log_in_time',
'updatedAtAttribute' =>  'log_in_time',
                ],
                ];
            }
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它不像你发布的那样有用.

这适合我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()'),
        ],
    ];
} 
Run Code Online (Sandbox Code Playgroud)