带有 ZF2 的 Doctrine 2 如何更新行

Posted

技术标签:

【中文标题】带有 ZF2 的 Doctrine 2 如何更新行【英文标题】:Doctrine 2 with ZF2 how to update row 【发布时间】:2014-01-21 13:03:03 【问题描述】:

我正在尝试使用以下方法更新实体中的一行:

$linker = $this->getObjectManager()->getRepository('\Schema\Entity\Link')->find('link_id', 7853);
           $linker->setSampleTitle($mytitle);
           $linker->setSampleDesc($mydesc);

           $this->getObjectManager()->merge($linker);
           $this->getObjectManager()->flush();

但我得到:此操作需要一个打开的事务。

【问题讨论】:

实际上您的两种find() 方法都是正确的。但是第一个“查询表”,第二个“查询数据库” - 可以这么说......正如@doeni所指出的,您只是使用了错误的函数来保存更新的实体。你要找的是persist(),而不是merge() 嗨,事实是我完全删除了 $this->getObjectManager()->merge($linker);并使用我在下面发布的方法,既不使用persist,也不使用merge。我只使用了merge因为我在另一篇文章中读到它,但不知道具体是做什么的。是否需要使用persist() 是的,我自己也忘记了。更新只需要刷新...不需要持久化,因为这都是在内部处理的,以防编辑。 flush() 会将其写入数据库 【参考方案1】:

试试这个:

$this->getObjectManager()->persist($linker);
$this->getObjectManager()->flush();

您可能还想使用 findOneBy 而不是 find。

【讨论】:

【参考方案2】:

我刚刚意识到,在 find() 方法中,我不应该放入 'link_id' 而是放入类 \Schema\Entity\Link。所以这里不需要getRepository()...

正确的是:$linker= $this->getObjectManager()->find('\Schema\Entity\Link', 7853);

【讨论】:

【参考方案3】:
$Link = $this->getObjectManager->getRepository('Schema\Entity\Link')->find( 7853 ); 

并通过@id 将link_id 定义为Entity 中的id 或使用findBy 关键字

【讨论】:

以上是关于带有 ZF2 的 Doctrine 2 如何更新行的主要内容,如果未能解决你的问题,请参考以下文章

ZF2 - Doctrine ORM,简单表连接

ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法

如何通过 ZF2 FormElementManager 将 Doctrine ObjectManager 传递给表单

zf2 + 学说 2 上的用户定义函数不起作用

ZF2 Doctrine Form 注解类型选择

尝试在 zf2 / 学说下的实体之间创建继承时出现“找不到类”