ORM-ManyToMany关系中的其他字段

时间:2015-03-16 22:09:04

标签: php symfony orm doctrine-orm doctrine

我有以下数据表:用户和组。在我的数据库中,这两个实体之间的关系是ManyToMany,因为许多用户可以在许多组中,并且许多组可以拥有许多用户。这很简单。我创建了这个代码并且它可以工作:

用户实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="Group", inversedBy="users")
     * @ORM\JoinTable(name="users_in_groups")
     */
    protected $groups;
}

群组实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="groups")
 */
class Group
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="groups")
     */
    protected $users;
}

Symfony创建了三个表:usersgroupsusers_in_groups。一切都很好,但我想为每个组中的不同用户设置不同的权限。例如:User1是Group1中的admin和Group2中的标准成员等。最好的解决方案是将新字段插入users_in_groups,但此表是由@ORM \ JoinTable函数创建的,我不知道如何我能做到吗你知道这个问题的简单解决方案吗?

2 个答案:

答案 0 :(得分:2)

我发现的最简单的方法是使用第三个实体

以下是它如何在你的情况下工作

用户实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

   /**
     * @ORM\OneToMany(targetEntity="UserGroup", mappedBy="user")
     * */
    protected $usergroup;
}

群组实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="groups")
 */
class Group
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
      * @ORM\OneToMany(targetEntity="UserGroup" , mappedBy="group"})
     * */
    protected $usergroup;
}

UserGroup实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="user_group")
 */
class UserGroup
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @var integer $id
     */
    protected $id;


    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="usergroup")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * */
    protected $user;

    /**
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="usergroup")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     * */
    protected $group;


    // Additional fields, Getter, Setters, _Construct, __toString 


}

答案 1 :(得分:1)

看看documentation on ManyToMany relationships

  

为什么多对多关联不太常见?因为经常要将其他属性与关联关联,所以在这种情况下引入关联类。因此,直接的多对多关联消失,并被3个参与类之间的一对多/多对一关联所取代。

换句话说,只要你想要一个关系表上的属性,它就不再只是一个关系表。它需要它自己的实体。这个新实体现在可以与用户和组建立一对多/多对一的关系。

然后,您可以在新实体中使用Composite and Foreign Keys as Primary Key功能。

过去关于此主题的讨论:https://groups.google.com/forum/#!topic/doctrine-user/0dh8lgUudvc