Doctrine / PostgreSQL没有在我的脚本

时间:2016-03-09 12:54:19

标签: php postgresql

我在脚本上运行了十几个更新语句,并且一些更新不会发生,我需要知道为什么以及如何解决这种情况。

我有这段代码:

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(); 

1 个答案:

答案 0 :(得分:0)

更新声明仅在最后由$ this-> em-> flush(); 这是告诉Doctrine开始SQL事务的唯一操作,如果你需要在此之前执行更新,只需调用flush方法。

在冲洗前的治疗期间,更改仍保留在与经理相关联的实体中。