ragnar_ok
@ragnar_ok

Bitrix D7 ORM: как узнать ID существующей записи?

Создал сущность BookTable. Добавил UniqueValidator для поля NAME. Теперь в случае, если обнаруживается дубликат, то запись не добавляется, а Result::isSuccess возвращает false.
class BookTable extends DataManager
{
    public static function getMap()
    {
        return [
            new Fields\IntegerField('ID', [
                'primary' => true,
                'autocomplete' => true,
            ]),
            new Fields\TextField('NAME', [
                'validation' => function() {
                    return [
                        new Fields\Validators\UniqueValidator('Not unique'),
                    ];
                }
            ]),
        ];
    }
}

Как в случае обнаружения дубликата получить ID уже существующей записи с этим NAME?
Сейчас я использую BookTable::getRow с фильтром по NAME в случае, если обнаружился дубликат.
$result = BookTable::add([
    'NAME' => 'NAME',
]);

if ($result->isSuccess()) {
    $result->getId();
} else {
    BookTable::getRow(['select' => ['ID'], 'filter' => ['NAME' => 'NAME']])['ID']; //  Приходится делать дополнительный запрос
}


Адекватно ли это решение?
  • Вопрос задан
  • 303 просмотра
Решения вопроса 1
Да - норм.
Но добавляю, что такое решение как предлагает eugenezadorin будет хорошим только в ситуации когда дубли очень вероятное и частое явление. В противном случае лучшим решением будет, собирать в отдельный массив в цикле имена, которые были отклонены, из-за дублирования, а потому в конце цикла добавления, если цикл имен не пуст, достать одним запросом список id соответствующий собранным в запросе именам.
Преимущество в том, что если конфликтов не случилось, запрос не делается вообще.

Кстати если добавление идет не в цикле, а вероятность дублей у вас больше 50% (даже возможно 40%) то лучшим решением будет сначала проверить нет ли уже записи с таким именем и только потому выполнять добавление, если ее нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@eugenezadorin
Адекватно, если это единичная операция добавления - например если это отправка формы.

Производительность может упасть, если такое добавление происходит в цикле, и дубликатов имени будет много. В этом случае возможно лучше будет заранее сформировать справочник существующих книг "имя - id", и по нему сверяться перед добавлением.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы