加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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中将它击败了.可能有一两个错字;)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读