ORM: уникальные поля и внешние ключи
Разработчики битрикс рекомендуют валидовать поля через валидаторы!
Я все же решил отдать эту работу msql и развить это идею в свой работе.
1. Это проще, потому что меньше работы - не нужно писать валидаторы.
2. Быстрее работает, не нужно делать селект перед добавлением или изменением, особенно заметно если обновлений/добавлений много
3. К уникальным индексам еще добавил обработку внешних ключей, это тоже сокращает время на написания всякого рода обработчиков для поддержки целостности данных
Идея заключается в том что бы использовать функционал MYSQL - индексов и внешних ключей, а при работе с ORM перехватить ошибки \Bitrix\Main\DB\SqlQueryException
Посмотреть что за ошибка и отдать свою соответствующею ошибку =)
У меня есть базовый ORM класс в котором есть переопределенные методы add, delete, update , например
При работе с ORM классом делаю примерно такое
Как вам такая идея? Какие Вы видите минусы ?
Разработчики битрикс рекомендуют валидовать поля через валидаторы!
Я все же решил отдать эту работу msql и развить это идею в свой работе.
1. Это проще, потому что меньше работы - не нужно писать валидаторы.
2. Быстрее работает, не нужно делать селект перед добавлением или изменением, особенно заметно если обновлений/добавлений много
3. К уникальным индексам еще добавил обработку внешних ключей, это тоже сокращает время на написания всякого рода обработчиков для поддержки целостности данных
Идея заключается в том что бы использовать функционал MYSQL - индексов и внешних ключей, а при работе с ORM перехватить ошибки \Bitrix\Main\DB\SqlQueryException
Посмотреть что за ошибка и отдать свою соответствующею ошибку =)
У меня есть базовый ORM класс в котором есть переопределенные методы add, delete, update , например
abstract class Base extends DataManager { public static function add(array $arFields) { try{ return parent::add($arFields); } catch (\Bitrix\Main\DB\SqlQueryException $e) { $msg = $e->getMessage(); if (strpos($msg, 'Duplicate entry') !== false) throw new Lib\Exception\DuplicateElement($e); elseif (strpos($msg, 'foreign key') !== false) throw new Lib\Exception\ForeignKey($e); else throw new \Bitrix\Main\DB\SqlQueryException($e); } } ... } |
При работе с ORM классом делаю примерно такое
try { $rs = MyOrmClass::add([ 'fields1' => 'val', 'fields2' => 'val' ]); } catch(Lib\Exception\DuplicateElement $e) { ShowError('Такой элемент уже существует'); } catch(Lib\Exception\ForeignKey $e) { ShowError('Нельзя удалить элемент, потому что он связан с другим объектом'); } |
Как вам такая идея? Какие Вы видите минусы ?