2015-07-07 11 views
5

Desidero implementare la funzionalità di blocco dei record nella mia applicazione Yii2.Come implementare il blocco del record mysql in Yii2

Se un utente apre aggiornamento link/registrazione (Es. http://localhost/myproject/backend/web/user/update/1) poi un altro utente non può accedere alla thislink e l'utente otterrà un ALERT messaggio che dice "Questo record già aperto da un altro utente". Quindi la registrazione/pagina dovrebbe bloccarsi per un altro utente. (Uguale al blocco di MS Excel)

Una volta che il primo utente termina e lascia il record/pagina, deve sbloccarsi e un altro utente può leggere/aggiornare i dati.

Quindi, come posso utilizzare il meccanismo di blocco del database mysql qui nei record attivi Yii2 o c'è un altro modo per implementarlo.

Qualsiasi aiuto sarebbe apprezzato.

risposta

2

È possibile aggiungere colonna locked_by_user al vostro tavolo e quando qualcuno viene richiesto aggiornamento azione che si verifica locked_by_user colonna se è impostata oppure no. In caso contrario, impostalo su user_id chi è la richiesta aggiornamento prima. Inoltre, è necessario preoccuparsi del ripristino delle serrature . E considera i casi in cui l'utente può semplicemente chiudere la finestra del browser e quindi la registrazione verrà bloccata finché non compie un'azione come salva record o annulla la modifica.

5

Si chiama blocco ottimistico e descritto in official docs. Ecco un esempio di implementazione:

// ------ view code ------- 

use yii\helpers\Html; 

// ...other input fields 
echo Html::activeHiddenInput($model, 'version'); 


// ------ controller code ------- 

use yii\db\StaleObjectException; 

public function actionUpdate($id) 
{ 
    $model = $this->findModel($id); 

    try { 
     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      return $this->redirect(['view', 'id' => $model->id]); 
     } else { 
      return $this->render('update', [ 
       'model' => $model, 
      ]); 
     } 
    } catch (StaleObjectException $e) { 
     // logic to resolve the conflict 
    } 
} 
+0

Ho fatto esattamente qualunque cosa menzionata nei documenti ufficiali ma non funziona per me. – Sky

+0

Non va nel blocco 'catch' – Sky

Problemi correlati