ORM (RedBean) и дубликаты ключей
В настоящее время я использую RedBean для ORM в своих моделях.
Мне нужно вставить данные в таблицу MySQL, где один из столбцов установлен на уникальный.
В настоящее время данные вставляются с помощью такой формы:
//Create
$object = R::dispense('object');
//Need to check if supplied name is a duplicate
$object->name = $name
$object->description = $description
//Save
R::store($object)
Теперь проблема в том, что если $name не было продублировано в базе данных, все идет хорошо. Если это дубликат, я могу поймать исключение и получить код ошибки SQL: 23000
Если я повторяю исключение, я получаю:
[23000] - SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'abc' for key 'name_UNIQUE'
Другая проблема состоит в том, что если у меня есть несколько полей, которые установлены в UNIQUE, исключение скажет мне только первое поле, которое дублируется. Поэтому, чтобы получить следующее поле, мне нужно убедиться, что пользователь исправляет первый дубликат и снова выполняет запрос.
Это кажется довольно неэффективным. Мне нужно иметь возможность проверить, вставил ли пользователь дублирующиеся данные в несколько полей, не выполняя при этом слишком много операторов SQL.
Каковы некоторые лучшие практики для этого? Кроме того, какова лучшая практика, когда дело доходит до того, было ли действие успешным, или если при неудаче, почему и какие поля возвращаются в контроллер?
Спасибо:)
1 ответ
Сначала вы должны выполнить "выбор", чтобы убедиться, что уникальные записи не существуют, другого пути нет... Если вы не хотите выполнять несколько запросов из своего кода, вы можете реализовать хранимую процедуру.
Это позволяет выполнять несколько запросов в рамках одной транзакции, что ограничивает нагрузку на сеть.
Это также позволит вам управлять несколькими видами ошибок (через коды ошибок AFAIR), что даст вам возможность четко определить проблемное поле.
Проверьте эту ссылку
Надеюсь, это поможет!