[英]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 列( admin
和client
)鏈接到相關實體。 它們可以是 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.