繁体   English   中英

反序列化后更新多对多关联的学说

[英]Doctrine updating many to many association after deserialization

我正在制作类似向导的东西,我需要将一个对象从一个请求传递到另一个请求。 我为此使用序列化。 对象是具有多对多关联的学说实体。 出于演示目的,我将简化,因为这个问题只涉及关联。

class User 
{

    // scalar properties

    /**
     * @var User\Role
     * @ORM\ManyToMany(targetEntity="User\Role", cascade={"persist", "remove"})
     * @ORM\JoinTable(name="roles")
     */
    protected $roles;

    // getters, setters
}

现在,当我反序列化对象时,它会通过关联完美地反序列化。 问题是,当我将它与 $em->merge($object); 合并时; 然后刷新,对象被保存到数据库中,所有更改的标量属性都正确持久化。 但是在保存过程中会忽略关联。 在保存之前,数据库中有三个角色。 我的关联中只有一个角色,但是当我刷新然后从数据库中重新加载对象时,仍然存在之前存在的三个角色。 此问题仅在反序列化时发生,如果我使用最初从 $em 加载的实体,则关联会按照应有的方式更新。

还有一件事 - 如果我在关联上定义级联 = {“合并”},合并操作以错误“spl_object_hash() 期望参数 1 为对象,给定的数组”在 1810 行的 UnitOfWork 中结束,其中角色数组(在这种情况下,只有一个元素)被传递给 spl_object_hash() 函数。 不确定这是错误还是我做错了什么。

有没有人知道如何解决这个问题,或者我做错了什么? 任何帮助表示赞赏!

今天我相同的问题,这就是为什么我在这里登陆。 看来我已经解决了:

cascade={"merge"}

绝对有用,一旦我在双方正确配置了 ManyToMany 关系,它就开始工作 - 不再有“spl_objects_hash()”问题。 注意 inversedBy 和 Mapped by。 另外,但我不知道这是否是技巧的一部分,看看 add 和 remove 方法(我在两边都实现了。)之前,我没有注意添加/删除另一边的关系……

class User {

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Project", cascade={"merge"}, inversedBy="users")

 * @JMS\Type("Relation<App\Entity\Project>")
 */
private $projects;
public function addProject(Project $project): self
{
    if (!$this->projects->contains($project)) {
        $this->projects[] = $project;
        $project->addUser($this);
    }

    return $this;
}

public function removeProject(Project $project): self
{
    if ($this->projects->contains($project)) {
        $this->projects->removeElement($project);
        $project->removeUser($this);
    }

    return $this;
}
}
class Project {
/**
 * @ORM\ManyToMany(targetEntity="App\Entity\User", mappedBy="projects")
 * @JMS\Type("Relation<App\Entity\Project>")
 */
private $users;
}

编辑:因此,在与另一个实体遇到相同问题后,我测试了在这种情况下是否需要在 add()/remove() 中删除和添加相关实体:NOPE。 级联={merge} 可以解决问题,它在正确配置反面后开始工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM