Orm 如何在symfony2中用复合键映射多对多关系

Orm 如何在symfony2中用复合键映射多对多关系,orm,symfony,doctrine-orm,mapping,relationships,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\u activities表,其中包含profile\u id和activity\u id 现在,用户将为每个配置文件的每个活动创建

我有这种情况

我有四节课

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\u activities表,其中包含profile\u id和activity\u id

现在,用户将为每个配置文件的每个活动创建一个工作簿

所以我对如何在数据库中映射感到困惑

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

class profile


@many to many
protected $activities

many to one
protected $user
但在课堂练习册中,如何定义属于活动和配置文件关系表的外键

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

@[一对一[活动主键\u配置文件表]


protected$workbook

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

所以,让我们举个例子(因为我不理解你的实体之间的关系)
考虑两个实体:用户和组。
一个用户可以属于n个组,一个组可以有m个用户。这意味着我们必须将m-n基数“分解”为
m-1-n
关系。
在symfony中(使用doctrine;我不知道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;
[...]
}

如您所见,这是一个php类的一部分,该类映射到带有条令(ORM)的db表中。
这个类包含一个属性
$groups
,它告诉(看看注释)这个类和另一个类(由
targetEntity
标识)之间是一种多对多关系,
inversedBy
告诉关系中涉及的属性(db列;如果您谈论类,则为属性)(外部键)

此实体为集团实体,具有关系的“另一方:
$user

如您所见,有
@ORM\manytomy(targetEntity=“User”,mappedBy=“groups”)
表示与class
User
的关系,而进入
User
类的字段是

现在,您可以在db php应用程序/控制台上运行用于实体生成的条令命令
条令:generate:entities Acme
,其中
Acme
是bundle的名称,技巧就完成了

mappedBy
inversedBy
上的一些单词:

  • 有“两个”方面:倒置的方面和拥有的方面。记住docrine只会“观察”到拥有方面的变化,所以要注意将其放入正确的类中
  • 反向边由
    mappedBy
    关键字标识,其值是所属边类的名称
  • 拥有方用
    inversedBy
    关键字标识,其值是反向方类的名称
  • 许多协会始终是拥有方
  • 一夫一妻的关系总是有相反的一面
  • oneToOne关系的拥有方始终是具有外部密钥的实体
  • 许多关系都是一样的

我的问题是,如果我们有其他实体,例如我们有实体
笔记本电脑
,每个
用户
每个
。那么我们如何在
笔记本电脑
中建立这种关系class@Zombie15如果这个实体不是与一个实体相关,而是与另一个实体相关,那么您可以将我上面解释的扩展到所有实体。如果你看到任何问题或不明白,请告诉我。
/**
 * @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;
[...]
}