在解释实体之间关系的创建时,我发现文档非常差。所以,我不得不向我的 StackExchangers 同伴寻求帮助。所以,我正在尝试构建以下案例:
情况1
AUser
属于一个或多个Group
,aGroup
可以有多个Permission
。AUser
也可以有一个Permission
.
案例2
ATicket
有 a Category
、 multipleTag
和 multiple Comment
。
提前致谢!
在解释实体之间关系的创建时,我发现文档非常差。所以,我不得不向我的 StackExchangers 同伴寻求帮助。所以,我正在尝试构建以下案例:
情况1
AUser
属于一个或多个Group
,aGroup
可以有多个Permission
。AUser
也可以有一个Permission
.
案例2
ATicket
有 a Category
、 multipleTag
和 multiple 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
。 cascade
意味着User
可以添加Group
和删除Group
班级组{
/**
* @ORM\ManyToOne(targetEntity="path\to\user, inversedBy="group")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
这是关系的保留方..targetEntity
应该有返回父实体的路径,User
在这种情况下。是来自实体inversedBy
的变量。只是告诉 Doctrine 加入什么,如果你不自己设置它会自动完成。User
JoinColumn