Doctrine ORM“通过给定的关联图找到多个非持久的新实体:”

问题描述 投票:0回答:4
$added_obj = []; 
foreach ($something as $data) {
    $obj = $this->class->function($data, $par2);

    if (null !== $obj && !(array_key_exists
    (->getVal1(), $added_obj[$obj->getVal1()] === $$obj->getVal2())) {
        $this->persister->persist($obj);
        $added_bank_account[$obj->getVal1()] = $obj->getVal2();
    } else {

    }
}

代码的作用:它调用一个返回实体或 null 的函数。如果创建了一个实体,则会检查数组中是否已存在 2 个值,如果不存在,则保留并将这 2 个值作为键/值对添加到数组中。

但是,当创建一个实体并且它已经存在于数组中时,我不希望它被持久化,但我不想对它执行任何操作。

但是,当我用它进行绝对归零时,我收到了错误: ```通过给定的关联图找到多个非持久的新实体:

  • 通过关系“MyCompany\Client\Entity\Client#something”找到了一个新实体,该实体未配置为级联实体的持久操作:

这是有道理的,因为教义不知道如何处理被创造的实体。如何才能“销毁”所创建的实体,从而解决问题。

当仅创建 1 个对象时,一切正常。

doctrine-orm doctrine
4个回答
0
投票

在您的情况下,您可以简单地

merge
clear
来自
entity
EntityManager

例如:

$em->merge($obj);

$em->clear($obj);

0
投票

我遇到了同样的问题,因为它试图在特定表中插入重复的注册表,而实际上我只是想更新它。

之后我正在做一个

persist
一个
flush

所以我发现(对很多人来说显而易见,但肯定有帮助):

->合并
如果 id 设置不正确,在许多情况下会重复注册表。 如果您尝试更新实体,这不是一个好主意。

->坚持
同样,如果您尝试更新一个实体,您可能不会使用它。它用于向数据库添加新实体。要更新记录,您只需使用

flush
,如文档中的此示例所示。


0
投票

我遇到了同样的问题,谷歌搜索这个错误并没有给我太多结果,但似乎在只有一个实体(而不是多个)的情况下,学说会给出不同的错误消息,它也有一个适用于多个实体的解决方案。所以,让我在这里留下一个链接:Doctrine - 通过关系找到了一个新实体


0
投票

如果您在另一个对象管理器中获取了相关实体,则会出现此问题。例如,如果之前通过异常检查重复并重置管理器。

© www.soinside.com 2019 - 2024. All rights reserved.