【问题标题】:Symfony2 & Doctrine2: Command loop creates new entity on each cycleSymfony2 和 Doctrine2:命令循环在每个循环中创建新实体
【发布时间】:2011-12-01 11:16:33
【问题描述】:

我有一个 Symfony2 CLI 脚本正在运行,它应该每 3 秒更新一次时间戳。 问题是:$this->em->persist($processInfo) 每次执行时都会在数据库中创建一个新条目。我希望它更新,而不是在每个周期创建。

$processInfo = new ....ProcessInfo();

while(true){
     $someObject = new ..();
     $this->em()->persist($someObject);

     $this->em()->clear(); // sorry forgot this line in my initial question

     $processInfo->setLastCheckOn($now); // to know if the script is still running, we set a timestamp in the db
     $this->em()->persist($processInfo);
     $this->em()->flush();


     sleep(3);
}

有什么想法吗?

【问题讨论】:

    标签: php symfony doctrine-orm command-line-interface


    【解决方案1】:

    只使用一次persist。然后您需要提交活动事务并启动一个新事务,以便告诉数据库保存它们并创建一个新事务:

    $processInfo = new ....ProcessInfo();
    $this->em()->persist($processInfo);
    $this->em()->getConnection()->commit();
    while(true){
        $processInfo->setLastCheckOn($now); // to know if the script is still running, we set a timestamp in the db
        $this->em()->flush();
        sleep(3);
    }
    

    【讨论】:

    • 你能描述一下你在这里做什么吗?这远非直观。此外,我在循环中有一些其他代码 - 我必须确保没有副作用......
    • @stoefln 删除了不必要的代码。问题是即使flush 将查询发送到数据库,symfony(或您)已经在您的代码中的某处启动了事务,并且在提交之前不会进行任何更改。 while(true) 是您代码中的无限循环,不会执行进一步的代码,因此事务将保持活动状态。您需要在 while 循环之前显式提交它并让flush 开始另一个事务。
    • 你是说最新版本的学说2?不,目前无法升级。如果我用最新版本测试它会回复你...
    • 不,我的意思是我编辑的代码的最后一个版本。如果$this->em()->getConnection()->commit(); 行出现错误,那么您还没有开始交易,应该删除该行。没有它,更改将被刷新。 (我想 setLastCheckOn 只是一个 setter 方法)。
    • 哦,非常抱歉,我的问题中忘记了一行。一个非常重要的:$this->em()->clear() 在循环中。现在对我来说似乎也更符合逻辑,为每个周期创建一个对象。问题是:我需要该行来确保在循环中修改的对象立即写入数据库(并发:我正在运行同一脚本的多个实例)所以也许我应该打开一个连接来编写 logInfo 和一个连接写其他对象?
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 2011-10-22
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2021-07-25
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多