Метод1: (не самый лучший)
Когда вызывается метод flush
, Symfony проходит через всех слушателей. Таким образом, вы можете избежать сброса на каждом цикле. Вы можете заменить каждый сброс следующим кодом:
if (0 === ($batchSize++ % $input->getOption('fetch'))) {
$this->entityManager->flush();
$this->entityManager->clear();
}
Параметр
fetch
может быть объявлен в методе configure:
const BATCH_SIZE = 1000; // As example
/**
* Configure the command.
*/
protected function configure()
{
$this
// the short description shown while running "php bin/console list"
->setDescription('Import a new developper.')
//This option helps you to find a good value and use BATCH_SIZE constant as default
->addOption('fetch', 'f', InputArgument::OPTIONAL, 'Number of loop between each flush', self::BATCH_SIZE)
// the full command description shown when running the command with
// the "--help" option
->setHelp('This command allows you to import a develpper...')
;
Метод 2: более эффективный
Вы можете создать команду, которая записывает все запросы SQL с обновлением или вставить в файл sql. Затем вы запускаете встроенную команду, которая читает файлы и выполняет запросы.
Метод 3: Использование DBAL
Как предлагается в комментариях, вы можете использовать DBAL , чтобы избежать ненужного увлажнения объекта с помощью Doctrine.