php – 如何在Symfony和Doctrine中使用ManyToMany和OneToMany?
发布时间:2020-12-13 18:25:28 所属栏目:PHP教程 来源:网络整理
导读:在解释实体之间关系的创建时,我发现文档很差.所以,我将不得不向我的StackExchangers同事寻求帮助.所以,我正在尝试构建以下案例: 情况1 用户属于一个或多个组,组可以拥有多个权限.用户也可以拥有权限. 案例2 票证具有类别,多个标记和多个注释. 提前致谢! 当
在解释实体之间关系的创建时,我发现文档很差.所以,我将不得不向我的StackExchangers同事寻求帮助.所以,我正在尝试构建以下案例:
情况1 用户属于一个或多个组,组可以拥有多个权限.用户也可以拥有权限. 案例2 票证具有类别,多个标记和多个注释. 提前致谢!
当然可以.首先要明白的是,没有“单向”可以做到这一点. Doctrine在
define the relationship方面提供了很大的灵活性 – 即使多个定义产生完全相同的DDL(理解这一点很重要 – 一些映射选择只影响ORM的对象端,而不是模型端) )
这是您的用户/组/权限示例,实际上是所有多对多关联(我排除了所有不相关但必需的代码,如PK列定义) <?php namespace YourBundleEntity; use DoctrineORMMapping as ORM; use DoctrineCommonCollectionsArrayCollection; /** * @ORMEntity */ class User { /** * Many-To-Many,Unidirectional * * @var ArrayCollection $groups * * @ORMManyToMany(targetEntity="Group") * @ORMJoinTable(name="user_has_group",* joinColumns={@ORMJoinColumn(name="user_id",referencedColumnName="id")},* inverseJoinColumns={@ORMJoinColumn(name="group_id",referencedColumnName="id")} * ) */ protected $groups; /** * Many-To-Many,Unidirectional * * @var ArrayCollection $permissions * * @ORMManyToMany(targetEntity="Permission") * @ORMJoinTable(name="user_has_permission",* inverseJoinColumns={@ORMJoinColumn(name="permission_id",referencedColumnName="id")} * ) */ protected $permissions; public function __construct() { $this->groups = new ArrayCollection(); $this->permissions = new ArrayCollection(); } } /** * @ORMEntity */ class Group { /** * Many-To-Many,Unidirectional * * @var ArrayCollection $permissions * * @ORMManyToMany(targetEntity="Permission") * @ORMJoinTable(name="group_has_permission",* joinColumns={@ORMJoinColumn(name="group_id",referencedColumnName="id")} * ) */ protected $permissions; public function __construct() { $this->permissions = new ArrayCollection(); } } /** * @ORMEntity */ class Permission {} 如果您对此处发生的事情有疑问,请与我们联系. 现在,到你的第二个例子 <?php namespace YourBundleEntity; use DoctrineORMMapping as ORM; use DoctrineCommonCollectionsArrayCollection; /** * @ORMEntity */ class Ticket { /** * Many-To-One,Unidirectional * * @var Category * * @ORMManyToOne(targetEntity="Category") * @ORMJoinColumn(name="category_id",referencedColumnName="id") */ protected $category; /** * Many-To-Many,Unidirectional * * @var ArrayCollection $permissions * * @ORMManyToMany(targetEntity="Tag") * @ORMJoinTable(name="tickt_has_tag",* joinColumns={@ORMJoinColumn(name="ticket_id",* inverseJoinColumns={@ORMJoinColumn(name="tag_id",referencedColumnName="id")} * ) */ protected $tags; /** * One-To-Many,Bidirectional * * @var ArrayCollection $comments * * @ORMOneToMany(targetEntity="Comment",mappedBy="ticket") */ protected $comments; public function __construct() { $this->tags = new ArrayCollection(); $this->comments = new ArrayCollection(); } } /** * @ORMEntity */ class Comment { /** * Many-To-One,Bidirectional * * @var Ticket $ticket * * @ORMManyToOne(targetEntity="Ticket") * @ORMJoinColumn(name="ticket_id",referencedColumnName="id") */ protected $ticket=null; } /** * @ORMEntity */ class Tag {} /** * @ORMEntity */ class Category {} 和以前一样,如果你想要解释的话,请告诉我. 附:这些都没有经过实际测试,我只是快速地在我的IDE中将它击败了.可能有一两个错字;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |