我对Doctrine 2& symfony中。
我有一个User
实体,还有三个实体Example1
,Example2
,Example3
我要链接。
我想在User
和这三个类之一Example1
,Example2
,Example3
之间定义一个多重关系,基于{{1}的值{}}中的{}和$relation_type
。
我正在考虑定义一个抽象类$parent
,因此User
,Player
,Example1
可以从中扩展,但我不知道如何继续...
有什么建议吗?
Example2
答案 0 :(得分:0)
如果Player
是一个抽象类,那么您可以将其标记为带有@MappedSuperClass
注释的映射超类。
另请查看the Doctrine2 documentation chapter 6.1. Mapped SuperClasses了解详情。
<?php
/** @MappedSuperclass */
class Player
{
//common properties
}
现在您可以在子类中扩展Player
:
<?php
/** @Entity */
class Example1 extends Player
{
//example1 specific properties.
}
使用映射的超类具有其局限性。仔细阅读文档,了解可能的内容和不可行的内容。
答案 1 :(得分:0)
您可能正在寻找STI,它基本上是多态数据的实现。
如果我正确理解您的用例,我会推荐以下结构
users[id, ..]
| 1-2-M
players[id, type, user_id, ..]
(*您可以更进一步,为每个示例创建+1表以存储特定数据)
将 Doctrine / Symfony 转换为
<?PHP
/**
* @ORM\Entity()
* @ORM\Table(name="users")
*/
class User {
}
-
<?PHP
/**
* @ORM\MappedSuperclass
* @ORM\Entity
* @ORM\Table(name="players")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({
* "Example1" = "AppBundle\Entity\Players\Example1",
* "Example2" = "AppBundle\Entity\Players\Example2",
* "Example3" = "AppBundle\Entity\Players\Example3",
* "undefined" = "Player"
* })
*/
abstract class Player
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", options={"unsigned"=true})
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="profiles", fetch="EAGER")
* @ORM\JoinColumn(nullable=false)
*/
protected $user;
}
-
/**
* @ORM\Entity
*/
class Example1 extends Player implements PlayerInterface
{
}