persist() и flush() внутри цикла - Доктрина
Я хочу знать, сколько раз коды ff: будут совершать круговые поездки в базу данных.
foreach ($recipients as $recipient) {
$received_email = new ReceivedEmail();
$received_email->setRecipient($recipient);
$received_email->setEmail($email);
$entityManager->persist($received_email);
$entityManager->flush();
}
$recipients
представляет собой массив объектов User с отношением "один ко многим" с ReceivedEmail
$email
объект с отношением "один ко многим" с ReceivedEmail.
Если, например, $recipients
имеет пять объектов, генерирует ли цикл в общей сложности пять поездок в базу данных? Или только один?
Является ли приведенный выше пример наиболее оптимизированным способом вставки новых записей ReceivedEmail?
Спасибо
1 ответ
Будет создан один оператор INSERT для каждого персистента.
Более того, вы можете просто отобразить свои операторы SQL для отладки, просто настройте Doctrine для ведения журнала: /questions/27331810/kak-otlazhivat-mysqldoctrine2-queries/27331829#27331829
В твоем случае:
$entityManager->getConfiguration()->
setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
Для многих вставок вы должны рассмотреть пакетную обработку:
- http://www.doctrine-project.org/blog/doctrine2-batch-processing.html
- http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html
Надеюсь, я обнаружил проблему.