如何在symfony2 Doctrine ORM中使用复合键映射多对多的关系

时间:2012-07-18 02:56:25

标签: orm symfony doctrine-orm mapping relationships

我有这个场景

我有四个班级

User
profiles
Activity
Workbook

user can have many profiles based on per year. Every year diff profile
User profile will have many to many with Activities

因此会有profile_activities表和profile_id以及activity_id

现在,用户将为每个配置文件执行每个活动1个工作簿

所以我很困惑如何在数据库中映射

我的意思是个人资料表,我可以

class profile


@many to many
protected $activities

many to one
protected $user

但是在类工作簿中如何定义属于活动和配置文件关系表的外键

对于每个活动,孩子必须完成工作簿。我应该如何定义

@[one to one [PK of activity_profile table]

protected $workbook

1 个答案:

答案 0 :(得分:2)

Symfony为您提供了执行此操作的不同方法。
其中一种方法是注释。使用注释,您可以直接将这些关系写入php类(如db列的类型,指定属性是否必需等等)。

所以,让我们采用这个例子(因为我理解你的实体之间的关系)
考虑两个实体:用户和组。
一个用户可以属于 n 组,一个组可以拥有 m 用户。这意味着我们必须分解"分解" m-n 基数为m-1-n关系 在symfony中(有了教义;我不知道mongodb和类似的是否相同)你还没有创建这个"中间表"作为一个PHP类。您需要做的就是,对PHP类的注释涉及,指定哪些表相关以及以何种方式相关 让我们看看如何!

/**
 * Acme\UserBundle\Entity\User
 *
 * @ORM\Table(name="users")
 * @ORM\Entity()
 */
class User implements AdvancedUserInterface
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
[...]
   /**
     * @ORM\ManyToMany(targetEntity="Groups", inversedBy="users")
     *
     */
    private $groups;
[...]

}

如您所见,这是使用doctrine(ORM)映射到db表的php类的一部分。
这个类有一个属性$groups,它告诉(看一下注释)这个类与另一个类(由targetEntity标识)和inversedBy之间的多对多关系什么属性(db列;如果你谈论类的属性)涉及到关系(外部密钥)。

/**
 * @ORM\Table(name="groups")
 * @ORM\Entity()
 */
class Groups implements RoleInterface
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
[...]
    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="groups")
     */
    private $users;
[...]
}

此实体是群组实体,并且具有"其他方面"关系:$user
正如您所看到的,@ORM\ManyToMany(targetEntity="User", mappedBy="groups")表示版权与类User相关,而User类的字段为groups

现在你可以运行doctrine命令将实体生成到db php app / console doctrine:generate:entities Acme,其中Acme是包的名称并且技巧已经完成。

mappedByinversedBy上的一些字词:

  • 有"两个"侧面:倒置侧和拥有侧。请记住,docrine将会观察"只改变到拥有方,所以要小心将它放入正确的类
  • 反面由mappedBy关键字标识,其值为拥有边类的名称
  • 拥有方标识为inversedBy关键字,其值为反向边类的名称
  • manyToOne协会始终拥有自己的一面
  • oneToMany协会总是反向的
  • oneToOne关系的拥有方始终是具有外部密钥的实体
  • 进入manyToMany关系是相同的