Impedire la cancellazione di record con collegamento – CakePHP 4

I vincoli di integrità impostati nel database, (come ON DELETE RESTRICT), sollevano delle eccezioni in caso di violazioni durante la scrittura o la cancellazione dei record.
Un modo semplice e comodo per prevenirle in CakePHP è usare le rules.

Un esempio particolare è rappresentato dalla situazione in cui si vuole eliminare un record che è collegato da una relazione ad altri record di un’altra tabella.
Ad esempio abbiamo le tabelle Users e Records, e la relazione nel Model Users

        $this->setTable('users');
        $this->setPrimaryKey('id');
        $this->hasMany('Records');

Quindi nello stesso Model Users, vado a impostare la seguente regola

 public function buildRules(RulesChecker $rules): RulesChecker
    {
        $rules->add($rules->isUnique(['username']), ['errorField' => 'username']);
        $rules->add($rules->isUnique(['email']), ['errorField' => 'email']);

        $rules->addDelete($rules->isNotLinkedTo('Records', 'records', "L'utente ha delle schede associate. "));

        return $rules;
    }

Il metodo $rules->addDelete mi permette di specificare che può avvenire la cancellazione di un utente solo se nella tabella Records, non ci sono elementi collegati ad esso.
Nel Controller Users posso intercettare i messaggi di errore utilizzando l’entità $user->getErrors()

$this->request->allowMethod(['post', 'delete']);
        $user = $this->Users->get($id);

        if ($this->Users->delete($user)) {
            $this->Flash->success(__('The user has been deleted.'));
        } else {
            $msg = '';
            $errors = $user->getErrors();
            foreach($errors as $table=>$errs){
                foreach($errs as $k => $v){
                    $msg .= "$v - ";
                }
            }
            
            $this->Flash->error(__('The user could not be deleted. Please, try again.')." - ".$msg);   
        }

        return $this->redirect(['action' => 'index']);

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.