基于字段值的实体之间的学说关系

时间:2016-12-20 12:42:05

标签: php inheritance doctrine-orm symfony

我对Doctrine 2& symfony中。

我有一个User实体,还有三个实体Example1Example2Example3我要链接。

我想在User和这三个类之一Example1Example2Example3之间定义一个多重关系,基于{{1}的值{}}中的{}和$relation_type

我正在考虑定义一个抽象类$parent,因此UserPlayerExample1可以从中扩展,但我不知道如何继续...

有什么建议吗?

Example2

2 个答案:

答案 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
{
}