内部循环中的persist()和flush() - Doctrine

问题描述 投票:4回答:1

我想知道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记录的最佳方式吗?

谢谢

php collections orm doctrine data-access-layer
1个回答
10
投票

将为每个持久性生成一个INSERT语句。

更重要的是,您可以只显示您的SQL语句进行调试,只需配置Doctrine进行日志记录:https://stackoverflow.com/a/4585421/1815881

在你的情况下:

$entityManager->getConfiguration()->
                setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());

对于许多插入,您应该考虑批处理:

希望我已经揭露了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.