Doctrine orm 合并原则2不起作用,给出错误
我正在尝试更新表中的一行。我使用的是条令2 ORM。我正在尝试使用Doctrine orm 合并原则2不起作用,给出错误,doctrine-orm,merge,Doctrine Orm,Merge,我正在尝试更新表中的一行。我使用的是条令2 ORM。我正在尝试使用merge()更新一行,据说它可以用来更新一行。但它给出了一个错误的说法 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[23000]:完整性约束冲突:1062重复项 我对第二条教义一无所知。请建议我可以做什么?何时合并 首先:当您有一个实体不是由EntityManager管理的,但您希望它是由EntityManager管理的时,您只需要$em->merge()。一个常见的用例是当您有一个序列化实体,并
merge()
更新一行,据说它可以用来更新一行。但它给出了一个错误的说法
致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[23000]:完整性约束冲突:1062重复项
我对第二条教义一无所知。请建议我可以做什么?何时合并
首先:当您有一个实体不是由EntityManager管理的,但您希望它是由EntityManager管理的时,您只需要$em->merge()
。一个常见的用例是当您有一个序列化实体,并且希望EntityManager开始管理它时
因此,合并实体与更新数据库中的实体没有直接关系
如果只需查找(使用$repo->find*()
)一个实体并进行更改,调用$em-flush()
就足够了。实体已经由EntityManager管理,不需要合并它
如何合并
使用$em->merge()
时的一个常见错误是传递的实体本身变成了托管实体。这不是真的,$em->merge()
返回一个表示托管实体的新对象
$managedEntity = $em->merge($detachedEntity);
在这行代码之后,$detachedEntity
仍然被分离(这意味着它仍然不由EntityManager管理)。它是$managedEntity
,您可以开始使用它进行更改
你的代码
根据您在注释中输入的代码,您可能希望执行以下操作:
$user = $entityManager->getRepository('User')->find($_REQUEST['id']);
$user->setName($_REQUEST['name']);
$user->setPassword($_REQUEST['pass']);
$entityManager->flush();
PS:看起来您正在数据库中保存纯文本密码。这从来都不是个好主意。何时合并
首先:当您有一个实体不是由EntityManager管理的,但您希望它是由EntityManager管理的时,您只需要$em->merge()
。一个常见的用例是当您有一个序列化实体,并且希望EntityManager开始管理它时
因此,合并实体与更新数据库中的实体没有直接关系
如果只需查找(使用$repo->find*()
)一个实体并进行更改,调用$em-flush()
就足够了。实体已经由EntityManager管理,不需要合并它
如何合并
使用$em->merge()
时的一个常见错误是传递的实体本身变成了托管实体。这不是真的,$em->merge()
返回一个表示托管实体的新对象
$managedEntity = $em->merge($detachedEntity);
在这行代码之后,$detachedEntity
仍然被分离(这意味着它仍然不由EntityManager管理)。它是$managedEntity
,您可以开始使用它进行更改
你的代码
根据您在注释中输入的代码,您可能希望执行以下操作:
$user = $entityManager->getRepository('User')->find($_REQUEST['id']);
$user->setName($_REQUEST['name']);
$user->setPassword($_REQUEST['pass']);
$entityManager->flush();
PS:看起来您正在数据库中保存纯文本密码。这从来都不是一个好主意。我已经在代码中这样做了。但它仍然不起作用,产生了与以前相同的错误。这里我给出了下面的示例代码$用户->设置名称($_请求['name']);$user->setPassword($_请求['pass']);$userchk=$entityManager->getRepository('User')->findBy(数组('name'=>$\u请求['name']);如果(count($userchk)==0){//保存在数据库$entityManager->persist($user);}否则{//更新在数据库$entityManager->merge($user);}$entityManager->flush();为什么你说你已经这样做了,而你显示的代码清楚地显示你没有这样做?我已经更新了我的答案,在你显示的代码中,你不需要合并。我一直缺少合并实际返回新对象的部分。这个答案对我很有帮助,即使现在我看到它在文档中有说明,但很容易被忽略。我已经在代码中这样做了。但它仍然不起作用,产生了与以前相同的错误。这里我给出了下面的示例代码$用户->设置名称($_请求['name']);$user->setPassword($_请求['pass']);$userchk=$entityManager->getRepository('User')->findBy(数组('name'=>$\u请求['name']);如果(count($userchk)==0){//保存在数据库$entityManager->persist($user);}否则{//更新在数据库$entityManager->merge($user);}$entityManager->flush();为什么你说你已经这样做了,而你显示的代码清楚地显示你没有这样做?我已经更新了我的答案,在你显示的代码中,你不需要合并。我一直缺少合并实际返回新对象的部分。这个答案对我很有帮助,即使现在我看到文档中有说明,但很容易被遗漏。