簡體   English   中英

與類型 Symfony Doctrine 的多對多關系

[英]ManyToMany Relationship With Type Symfony Doctrine

我有這種實體結構

class Group
{
    /**
     * @var int
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private int $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=50, nullable=false)
     */
    private string $name;
}


class GroupUser
{
    /**
     * @var int
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private int $id;

    /**
     * @var Group
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="GroupUser")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=false)
     */
    private Group $group;

    /**
     * @var string
     * @ORM\Column(type="string", length=50, nullable=false)
     */
    private string $type;

    /**
     * @var int
     * @ORM\Column(type="integer", nullable=false)
     */
    private int $user;

}

並且有兩種類型的用戶。 管理員和客戶。 組和用戶之間存在多對多關系。 GroupUser $type 中的屬性正在保存管理員或客戶端的 Class,而 $user 屬性正在保存 id。

ID group_id 用戶 類型
1 1 1 實體\管理員
2 2 1 實體\客戶

如何從管理員和客戶端使用 doctrine 加入它? 或者也許有人可以指出一些資源,這種關系如何在 doctrine 上起作用? 因為我很難用谷歌搜索任何東西。 我想它可能就像一個有條件的leftJoin,但我似乎無法弄清楚。

通常,您不能在數據庫上執行此操作,因為它不安全。 為什么不安全? 因為您可以在userGroup表的user列中有一個id ,因為它沒有鏈接,所以它沒有引用任何內容。

我會寫出你應該做的事情,以及如何使用自己的方法實現你想要的:

您應該做什么:在您的UserGroup實體中,有 2 列( adminclient )鏈接到相關實體。 它們可以是 null( Client是 null,如果是管理員,則admin包含admin實體的 ID,反之亦然)。 然后你可以刪除type

如何使用您的方法實現您的目標:由於無法在數據庫中完成,您必須在某個管理器中完成。 有一個方法getUser它將檢查您的type屬性並從存儲在$user中的當前 id 返回關聯的實體

例子:

    public function getUserFromGroupUser(GroupUser $groupUser){
        if('Entity\Admin' ===$groupUser->getType()){
            return $this->adminRepository->find($groupUser->getUser());
        }
        if('Entity\Client' ===$groupUser->getType()){
            return $this->ClientRepository->find($groupUser->getUser());
        }
        throw new \RuntimeException('the type does not exist');
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM