[英]How to ManyToMany and OneToMany in Symfony and Doctrine?
在解釋實體之間關系的創建時,我發現文檔很差。 所以,我將不得不向我的StackExchangers同事尋求幫助。 所以,我正在嘗試構建以下案例:
情況1
User
屬於一個或多個Group
, Group
可以具有多個Permission
。 User
也可以擁有Permission
。
案例2
Ticket
具有Category
,多個Tag
和多個Comment
。
提前致謝!
當然可以。 首先要明白的是,沒有“單向”可以做到這一點。 Doctrine在定義關系方面提供了很大的靈活性 - 即使多個定義產生完全相同的DDL(這一點很重要,理解 - 一些映射選擇只會影響ORM的對象端,而不是模型-側)
這是您的用戶/組/權限示例,實際上是所有多對多關聯(我排除了所有不相關但必需的代碼,如PK列定義)
<?php
namespace Your\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class User
{
/**
* Many-To-Many, Unidirectional
*
* @var ArrayCollection $groups
*
* @ORM\ManyToMany(targetEntity="Group")
* @ORM\JoinTable(name="user_has_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
/**
* Many-To-Many, Unidirectional
*
* @var ArrayCollection $permissions
*
* @ORM\ManyToMany(targetEntity="Permission")
* @ORM\JoinTable(name="user_has_permission",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
* )
*/
protected $permissions;
public function __construct()
{
$this->groups = new ArrayCollection();
$this->permissions = new ArrayCollection();
}
}
/**
* @ORM\Entity
*/
class Group
{
/**
* Many-To-Many, Unidirectional
*
* @var ArrayCollection $permissions
*
* @ORM\ManyToMany(targetEntity="Permission")
* @ORM\JoinTable(name="group_has_permission",
* joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
* )
*/
protected $permissions;
public function __construct()
{
$this->permissions = new ArrayCollection();
}
}
/**
* @ORM\Entity
*/
class Permission {}
如果您對此處發生的事情有疑問,請與我們聯系。
現在,到你的第二個例子
<?php
namespace Your\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class Ticket
{
/**
* Many-To-One, Unidirectional
*
* @var Category
*
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $category;
/**
* Many-To-Many, Unidirectional
*
* @var ArrayCollection $permissions
*
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(name="tickt_has_tag",
* joinColumns={@ORM\JoinColumn(name="ticket_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
* )
*/
protected $tags;
/**
* One-To-Many, Bidirectional
*
* @var ArrayCollection $comments
*
* @ORM\OneToMany(targetEntity="Comment", mappedBy="ticket")
*/
protected $comments;
public function __construct()
{
$this->tags = new ArrayCollection();
$this->comments = new ArrayCollection();
}
}
/**
* @ORM\Entity
*/
class Comment
{
/**
* Many-To-One, Bidirectional
*
* @var Ticket $ticket
*
* @ORM\ManyToOne(targetEntity="Ticket")
* @ORM\JoinColumn(name="ticket_id", referencedColumnName="id")
*/
protected $ticket=null;
}
/**
* @ORM\Entity
*/
class Tag {}
/**
* @ORM\Entity
*/
class Category {}
和以前一樣,如果你想要解釋的話,請告訴我。
PS這些都沒有經過實際測試,我只是快速地在我的IDE中將它擊敗了。 可能有一兩個錯字;)
嘗試這個:
Class User {
/**
* @ORM\OneToMany(targetEntity="path\to\group", mappedBy="user", cascade={"persist", "remove"})
*/
private $group;
User
和Group
之間將具有一對多關系targetEntity
是您希望與之關系的實體的路徑, mappedBy
是來自Group
Entity的變量。 cascade
意味着User
可以添加到Group
並從Group
刪除
班級組{
/**
* @ORM\ManyToOne(targetEntity="path\to\user, inversedBy="group")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
這是關系的保留方targetEntity
應該具有返回父實體的路徑,在這種情況下是User
。 inversedBy
是User
實體的變量。 JoinColumn
只是告訴Doctrine要加入什么,如果你沒有自己設置,這將自動完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.