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('Нельзя удалить элемент, потому что он связан с другим объектом');
}
|
Как вам такая идея? Какие Вы видите минусы ?