【问题标题】:merge in doctrine 2 not working giving error在学说2中合并不起作用给出错误
【发布时间】:2015-01-07 12:40:15
【问题描述】:

我正在尝试更新表中的一行。我正在使用学说 2 ORM。我正在尝试使用merge() 更新一行,据说可以用来更新一行。但它给出了一个错误提示

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE[23000]:违反完整性约束:1062 重复条目

我是教义 2 的新手。请建议我该怎么做?

【问题讨论】:

    标签: doctrine-orm merge


    【解决方案1】:

    何时合并

    首先:当您有一个不受 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:看起来您正在将纯文本密码保存在数据库中。这绝不是一个好主意。

    【讨论】:

    • 我已经在代码中做了这个。但它仍然无法正常工作,给出与以前相同的错误。在这里,我给出了下面的示例代码。 $user->setName($_REQUEST['name']); $user->setPassword($_REQUEST['pass']); $userchk= $entityManager->getRepository('User')->findBy(array('name' => $_REQUEST['name'])); if(count($userchk) == 0) { // 存入数据库 $entityManager->persist($user); } else { //更新数据库 $entityManager->merge($user); } $entityManager->flush();
    • 为什么你说你已经这样做了,而你显示的代码清楚地显示你没有?
    • 我已经更新了我的答案,在你显示你不需要合并的代码中。
    • 我一直错过合并实际返回新对象的部分。这个答案对我有帮助,即使现在我看到文档中也有说明,很容易错过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多