У меня есть реляционная база данных, идентификатор записи которой в одной таблице используется в качестве внешнего ключа в других реляционных таблицах. У меня есть операция удаления. Конечно, я хочу предотвратить удаление любой записи, идентификатор которой используется в качестве внешнего ключа в другой таблице. Мое решение состоит в том, чтобы найти запись во всех реляционных таблицах одну за другой по идентификатору записи, которую я хочу удалить. Если ничего не найдено, его можно удалить. Но это решение неэффективно, так как вам нужно найти записи во всех реляционных таблицах одну за другой.
Конечно, MySQL имеет некоторые ограничения в отношении отношений, такие как ON DELETE RESTRICT или NO ACTION. Но затем, когда я удаляю запись, идентификатор которой используется в другой таблице, я получаю сообщение об ошибке с некоторым исходным кодом, который я не хочу показывать. Я попытался использовать try catch следующим образом, но это не работает.
$model= $this->findModel($id);
try {
$model->delete();
} catch(Exception $e) {
throw new \yii\web\ForbiddenHttpException('Could not delete this record.' . $e);
}
Но попытка поймать не работает для меня. Это любое другое решение, чтобы проверить, используется ли идентификатор записи в другой реляционной таблице? Я работаю с Yii Framework 2.0
Вы должны просто поймать IntegrityException
:
$model= $this->findModel($id);
try {
$model->delete();
} catch(\yii\db\IntegrityException $e) {
throw new \yii\web\ForbiddenHttpException('Could not delete this record.' . $e);
}
Других решений пока нет …