我正在制作类似向导的东西,我需要将一个对象从一个请求传递到另一个请求。我为此使用序列化。该对象是具有多对多关联的学说实体。出于演示目的,我将简化,因为此问题仅涉及关联。
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()函数。不确定这是一个错误还是我做错了。
有没有人知道如何解决这个问题,或者我做错了什么?任何帮助表示赞赏!
答案 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}完成了窍门,该窍门在正确配置反面之后开始起作用。