несколькими значениями. Добавление и удаление записей доступно пользователю.
Как проверить используется ли где-то удаляемая запись, чтобы запретить её удалять?
Например: есть таблица с марками автомобилей.
Редактор хочет удалить марку 'BMW'. У ней в таблице моделей ID = 3, например. Но если в таблице машин есть поле 'model' со значением = 3, то не даём удалять.
мой вариант:
if (Car::whereModel($id)->exists()) {
throw ValidationException ......
}
Проблема: а вдруг этот справочник с марками заходят использовать в другой модели тоже?
В общем, как правильно проверять использование значения перед удалением?
restrictOnDelete при создании foreign связи. В случае удаления дочерней, база вернёт ошибку нарушения целостности, которую можно отловить и выдать юзеру что так делать нельзя.
> Проблема: а вдруг этот справочник с марками заходят использовать в другой модели тоже? В этом случае используется три таблицы: юзеры, справочник и pivot таблица для из связи. При создании foreign связи указывается cascadeOnDelete. При удалении пользователя также удалится его пивот-связь не трогая справочники.
Ответ на вопрос как проверять использование перед удалением, написан над самим вопросом в том же сообщении - пройтись по моделям, если их несколько, и проверить. Это если проверку реализовывать на стороне приложения.
проблема в том, что есть одна таблица всех справочников (различаются по полю code), а у всех других таблиц поля просто тупо типа такого: $table->bigInteger('status')->nullable()->comment('тыц'); без всяких связей
Тогда проверять на стороне Лары. Пример такой проверки ты сам написал в том сообщении.
ну, сейчас так и делаю. Но вот подумал, что это плохой подход. Как раз натолкнулся на проблему, что у меня один справочник в двух разных моделях используется.
Подход не плохой. Он очень часто применяется. Просто добавь проверку на другую модель.
еще не всё так запущено... можно даже migrate fresh делать )) Так что вариант переписать связи - не исключается
Обсуждают сегодня