如何在Yii2中使用乐观锁编写更新操作?

qnzebej0  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(307)

我在Yii2中使用乐观锁定编写待办事项应用程序。
我现在需要写更新动作。我试着写模型,控制器和视图来达到这个目的。
我使用此文档链接:www.example.com我的型号:https://www.yiiframework.com/doc/guide/2.0/en/db-active-record#optimistic-locks My model:

  1. <?php
  2. namespace app\models;
  3. use yii\behaviors\OptimisticLockBehavior;
  4. use yii\db\ActiveRecord;
  5. class RecordModel extends ActiveRecord
  6. {
  7. public static function tableName()
  8. {
  9. return 'records';
  10. }
  11. public function behaviors()
  12. {
  13. return [
  14. OptimisticLockBehavior::class,
  15. ];
  16. }
  17. public function optimisticLock()
  18. {
  19. return 'version';
  20. }
  21. }

我的控制器:

  1. <?php
  2. namespace app\controllers;
  3. use Yii;
  4. use app\models\RecordModel;
  5. use yii\db\StaleObjectException;
  6. class RecordController extends AppController
  7. {
  8. public function actionUpdate($id=1)
  9. {
  10. $model = RecordModel::find()->where(['id' => $id])->one();
  11. //debug($model);die();
  12. try {
  13. if ($model->load(Yii::$app->request->post()) && $model->save()) {
  14. Yii::$app->session->setFlash('success', 'Success');
  15. return $this->refresh();
  16. } else {
  17. return $this->render('update', [
  18. 'model' => $model,
  19. ]);
  20. }
  21. } catch (StaleObjectException $e) {
  22. Yii::$app->session->setFlash('error', 'Error');
  23. }
  24. }

我的update.php文件

  1. <h1>index</h1>
  2. <?php
  3. use yii\helpers\Html;
  4. use yii\widgets\ActiveForm;
  5. ?>
  6. <?php if( Yii::$app->session->hasFlash('success') ): ?>
  7. <div
  8. class="alert alert-success alert-dismissible"
  9. role="alert"> <button type="button" class="close"
  10. data-dismiss="alert"
  11. aria-label="Close"><span
  12. aria-hidden="true">&times;</span></button>
  13. <?php echo Yii::$app->session->getFlash('success'); ?>
  14. </div>
  15. <?php endif; ?>
  16. <?php if( Yii::$app->session->hasFlash ('error') ): ?>
  17. <div class="alert alert-danger alert-dismissible"
  18. role="alert"> <button type="button"
  19. class="close" data-dismiss="alert" aria-label="Close"><span
  20. aria-hidden="true">&times;</span></button>
  21. <?php echo Yii::$app->session->getFlash('error'); ?>
  22. </div>
  23. <?php endif; ?>
  24. <? $form = ActiveForm::begin();?>
  25. <?= $form->field($model, 'text')->label('Text');?>
  26. <? echo Html::activeHiddenInput($model, 'version');?>
  27. <?= Html::submitButton('Send', ['class' => 'btn btn-success']);?>
  28. <? ActiveForm::end();?>

但是我的代码好像没有做我想做的事情。请帮帮我!

13z8s7eq

13z8s7eq1#

  1. In your update.php view, make sure that you are including the version attribute as a hidden input field:
  2. public function actionUpdate($id){
  3. $model = RecordModel::findOne($id);
  4. try {
  5. if ($model->load(Yii::$app->request->post())){
  6. $model->text = Yii::$app->request->post('RecordModel')['text'];
  7. $model->version = Yii::$app->request->post('RecordModel')['version'];
  8. if ($model->save()) {
  9. Yii::$app->session->setFlash('success', 'Record updated successfully.');
  10. } else {
  11. Yii::$app->session->setFlash('error', 'Failed to update record.');
  12. }
  13. return $this->redirect(['index']);
  14. }
  15. } catch (StaleObjectException $e) {
  16. Yii::$app->session->setFlash('error', 'Record has been modified by another user. Please reload the record and try again.');
  17. }
  18. return $this->render('update', [
  19. 'model' => $model,
  20. ]);
  21. }
展开查看全部

相关问题