Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm 合并原则2不起作用,给出错误_Doctrine Orm_Merge - Fatal编程技术网

Doctrine orm 合并原则2不起作用,给出错误

Doctrine orm 合并原则2不起作用,给出错误,doctrine-orm,merge,Doctrine Orm,Merge,我正在尝试更新表中的一行。我使用的是条令2 ORM。我正在尝试使用merge()更新一行,据说它可以用来更新一行。但它给出了一个错误的说法 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[23000]:完整性约束冲突:1062重复项 我对第二条教义一无所知。请建议我可以做什么?何时合并 首先:当您有一个实体不是由EntityManager管理的,但您希望它是由EntityManager管理的时,您只需要$em->merge()。一个常见的用例是当您有一个序列化实体,并

我正在尝试更新表中的一行。我使用的是条令2 ORM。我正在尝试使用
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();为什么你说你已经这样做了,而你显示的代码清楚地显示你没有这样做?我已经更新了我的答案,在你显示的代码中,你不需要合并。我一直缺少合并实际返回新对象的部分。这个答案对我很有帮助,即使现在我看到文档中有说明,但很容易被遗漏。