簡體   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