我在脚本上运行了十几个更新语句,并且一些更新不会发生,我需要知道为什么以及如何解决这种情况。
我有这段代码:
foreach($clis as $c => $cli)
{
//... do some stuff
foreach($emails as $e)
{
$Mailqueue = $this->em->getRepository('Sendsys\Entity\Mailqueue')->findBy(array("email" => $e,"status" => "P"));
foreach($Mailqueue as $queue)
{
$queue->setStatus('S');
$this->em->persist($queue);
}
}
$this->em->flush(); //entity manager is retrieved before that
}
这基本上通过一个(有点大)表来更新状态为“P”到“S”的电子邮件,这些电子邮件位于$ emails数组的列表中。
我尝试使用doctrine的 ExecuteUpdate 和预先准备好的语句,而不是每次检索和保存实体,但它会导致完全相同的问题。
更多细节:
即使邮件发送功能已注释
,也会出现问题我知道正在发送所有电子邮件(取消注释时)并且脚本正在生成所有更新语句,我在测试ExecuteUpdate时输出了它们
我知道更新正在进入Postgres,因为有些行会更新,如果我刷新行会随机更新,直到没有任何行
我不能随后更新所有内容,我需要知道脚本在发生故障时停止的位置。
修改的
这与教义无关,我直接连接到数据库并在循环中运行以下语句:
$dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("UPDATE mailqueue SET status = 'S' WHERE status = :status AND email LIKE :mail");
$stmt->execute(array( ':status' => 'P', ':mail' => $e ));
echo $stmt->rowCount();
答案 0 :(得分:0)
更新声明仅在最后由$ this-> em-> flush(); 这是告诉Doctrine开始SQL事务的唯一操作,如果你需要在此之前执行更新,只需调用flush方法。
在冲洗前的治疗期间,更改仍保留在与经理相关联的实体中。