反序列化后,Doctrine更新了多个关联

时间:2016-12-12 11:15:25

标签: php doctrine-orm doctrine

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

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加载的实体,则关联会像它应该更新一样。

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

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

1 个答案:

答案 0 :(得分:0)

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

cascade={"merge"}

绝对有用,一旦我在两边都正确配置了ManyToMany关系,它便开始工作-不再发出“ spl_objects_hash()”。注意逆和映射。另外,但我不知道这是否是技巧的一部分,请看一下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。 Cascade = {merge}完成了窍门,该窍门在正确配置反面之后开始起作用。