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']);