2017-01-31 4 views
-1

Мне нужно вставить нескольких пользователей из файла Excel с помощью команды Symfony3. Я прочитал следующую статью о пакетной обработке: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.htmlSymfony3: обработка пакетной обработки Doctrine с обработкой исключений

Мне было интересно, есть ли способ остановить процесс промывки, когда запрос завершился неудачно (например, для не нулевого столбца). Мне бы хотелось, чтобы я не мог проверять все свои данные, прежде чем выполнять упорство, и позволить Doctrine продолжить вставки, даже если запрос завершился неудачно в 20-кратном запросе.

Благодарим за помощь.

С наилучшими пожеланиями,

+0

В принципе нет. Нарушение ограничения в основном означает, что вы больше не можете использовать диспетчер объектов. Были разговоры об изменении этого, но еще ничего. Поэтому, столкнувшись с исключением, ваш единственный выбор заключается в создании совершенно нового объекта менеджера сущностей. ORM не настроен для пакетной обработки. Другой подход заключается в использовании уровня абстракции базы данных Doctrine (DBAL). – Cerad

+0

Благодарим вас за ответ. Поэтому я предполагаю, что мои варианты - либо проверить все до сброса, либо использовать один флеш для каждого объекта и создавать экземпляр нового диспетчера объектов каждый раз, когда он терпит неудачу. Правильно? Что было бы неправильно при использовании флеша для объекта, если у меня есть 2000 записей для хранения в строке? Спасибо – mentinet

+1

Ничего страшного в том, что после каждой сущности, если вы столкнетесь с проблемами производительности, ничего не получается. Но объекты 2K должны быть в порядке. 20K может быть не так много. И да, проверка, прежде чем пытаться сохранить, вероятно, стоит усилий. – Cerad

ответ

0

Этот шаблон может помочь вам идти дальше ...

$batchSize = 20; 
$currentSize = 0; 

$data = [ .... ]; 
foreach ($data as $item) { 
    $entity = new Entity(); 
    $entity->setProperty($item['property']); 

    try { 
     $currentSize++; 
     $em->persist($entity); 

     if ($batchSize% $currentSize === 0) { 
      $em->flush(); 
      $em->clear(); 
     } 
    } catch (\Doctrine\ORM\ORMException $e) { 
     $currentSize--; 
    } 
} 

$em->flush(); 
$em->clear(); 
+0

Спасибо. Но похоже, что это не скажет мне, какая сущность потерпела неудачу. Кроме того, если один объект не сфотографирован, вся партия не работает правильно? – mentinet

+0

Как я уже сказал, это просто шаблон. Если вы хотите узнать, какой объект вызывает сбои, вы можете добавить $ failedEntities = []; над циклом и добавить $ failedEntities [] = $ entity; внутри улова. Добавить $ container-> get ('doctrine') -> resetManager(); $ em = $ container-> get ('doctrine') -> getManager() внутри catch, чтобы воссоздать новый $ em после сбоя. –

Смежные вопросы