Yii2 как реализовать оптимистичные блокировки - PullRequest
0 голосов
/ 16 октября 2019

Yii2, как реализовать оптимистические блокировки. Я пытаюсь следовать этому официальному документу.

Я думал, что тщательно следую за шагом. но все равно ошибка: enter image description here

Вот моя процедура.

  1. Создать столбец в БД "версия defualt velue = '0' enter image description here

2.Model.php

use yii\behaviors\OptimisticLockBehavior;

class OptimisticTest extends \yii\db\ActiveRecord
{

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


    public function rules()
        {
            return [
                [['version'], 'required'],
                [['created_by', 'updated_by','version'], 'integer'],
            ];
        }

  public function behaviors()
    {
        return [
            [
               'class' => TimestampBehavior::className(),
                'value' => new Expression('NOW()'),
            ],
            [
               'class' => BlameableBehavior::className(),
            ],
            [
                 'class' => OptimisticLockBehavior::className(), //'getLockAttribute' =>$this->version
           ],
        ];
    }

}

myController.php

 public function actionUpdate($id)
{
  $model = $this->findModel($id);
  $tempDocs = $model->docs;
  $modelRunning = $this->findModelRunning($model->running_id);
  $model->scenario = 'update';
 try {
    if ($model->load(Yii::$app->request->post()) &&
        $modelRunning->load(Yii::$app->request->post()) &&
        Model::validateMultiple([$model,$modelRunning]))
    {
      if($modelRunning->save())
        {
        $this->CreateDir($model->ref);
        $model->docs = $this->uploadMultipleFile($model,$tempDocs);
        $model->save();
        }
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('update', [
            'model' => $model,
            'modelRunning' => $modelRunning,
        ]);
    }
} catch (StaleObjectException $e) {
    // logic to resolve the conflict
      Yii::$app->session->setFlash('danger',Yii::t('app', 'Record can not be updated, there is a user associated with it'));
        return $this->redirect(['index']);
}}

Ошибка из Model.php в поведениях публичных функций ()

на шаге 1. Переопределите этот метод навернуть имя этого столбца. как переопределить этот метод. что я пропускаю.

enter image description here

1 Ответ

1 голос
/ 16 октября 2019

Переопределение метода optimisticLock() означает, что вы должны реализовать метод в своей модели, чтобы его можно было использовать вместо реализации по умолчанию.

Ваша модель должна выглядеть следующим образом

class OptimisticTest extends \yii\db\ActiveRecord
{
    //... your other methods in model

    public function optimisticLock()
    {
        //this method should return the name of version attribute
        return 'version';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...