【发布时间】:2015-01-07 12:40:15
【问题描述】:
我正在尝试更新表中的一行。我正在使用学说 2 ORM。我正在尝试使用merge() 更新一行,据说可以用来更新一行。但它给出了一个错误提示
致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE[23000]:违反完整性约束:1062 重复条目
我是教义 2 的新手。请建议我该怎么做?
【问题讨论】:
标签: doctrine-orm merge
我正在尝试更新表中的一行。我正在使用学说 2 ORM。我正在尝试使用merge() 更新一行,据说可以用来更新一行。但它给出了一个错误提示
致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE[23000]:违反完整性约束:1062 重复条目
我是教义 2 的新手。请建议我该怎么做?
【问题讨论】:
标签: doctrine-orm merge
首先:当您有一个不受 EntityManager 管理的实体但您想要它时,您只需要$em->merge()。一个常见的用例是当您有一个序列化的实体,并希望 EntityManager 开始管理它时。
所以合并实体不与更新数据库中的实体直接相关。
如果您只是找到(使用$repo->find*())一个实体并进行更改,调用$em-flush() 就足够了。实体已经由 EntityManager 管理,无需合并。
使用$em->merge() 时的一个常见错误是传递的实体本身成为托管实体。这不是真的,$em->merge() 返回一个代表托管实体的新对象。
$managedEntity = $em->merge($detachedEntity);
在这行代码之后,$detachedEntity 仍然是分离的(意味着它仍然不受 EntityManager 管理)。它是$managedEntity,您可以开始使用它来进行更改。
鉴于您在 cmets 中输入的代码,您可能想要执行以下操作:
$user = $entityManager->getRepository('User')->find($_REQUEST['id']);
$user->setName($_REQUEST['name']);
$user->setPassword($_REQUEST['pass']);
$entityManager->flush();
PS:看起来您正在将纯文本密码保存在数据库中。这绝不是一个好主意。
【讨论】: