我有这个场景
我有四个班级
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
答案 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
是包的名称并且技巧已经完成。
mappedBy
和inversedBy
上的一些字词:
mappedBy
关键字标识,其值为拥有边类的名称inversedBy
关键字,其值为反向边类的名称