带有 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 - 使用查询构建器如何指向存储库中的自定义方法