Doctrine是否为多态关系提供支持?

时间:2018-04-10 16:45:33

标签: database-design doctrine-orm relational-database polymorphic-associations

有一个类型/表EveryoneNeedsMe / everyone_needs_me(在我的具体情况下,它是Message / messages)。实际上有多种类型/表,需要它,例如Foo / fooBar / bar。我想使用多态关系模式(或多态关联):

objects_to_enm
- id
- everyone_needs_me_id
- object_type // e.g. "foo" or "bar"
- object_id // the foo's or bar's IDs
// The combination of object_type and object_id has to be UNIQUE.

everyone-needs-me

一些ORM(例如Eloquent,s。docu)支持多态关系模式。 Doctrine 2也支持它吗?

如果是:如何在Doctrine 2中使用它?如果否:如何使用Doctrine处理此案例?

1 个答案:

答案 0 :(得分:0)

是的,Doctrine支持多个继承映射。 但是,如果我清楚地了解你希望每个实体都有自己的数据库表。

所以你可以这样做,定义父类

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"foo"="Foo","bar"="Bar"})
 */
abstract class ParentClass
{

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Message")
     */
    protected $message;

   //getter,setter,other code
}

您的班级FooBar会延长ParentClass例如

/**
 * @ORM\Entity()
 */
class Foo extends ParentClass
{
    /**
     * @ORM\Column(type="string")
     */
    protected $body;
}

所以在那之后你可以做

$foo = new Foo();
$foo->setId(1);
$foo->setBody('Some Text');
$foo->setMessage($messageObject);
$entityManager->persist($foo);
$entityManager->flush();

parentclass表格中,您将获得类似

的内容
| id         | message_id | discr      |
|------------|------------|------------|
| 1          |        1*  |     foo     

然后在你的代码中你可以

$fooObject = $entityManager->getRepository(ParentClass::class)->find(1);

Doctrine会在此示例id对象中自动返回与Foo持久保存的对象。

完整文档,另一种如何处理继承映射的方法,例如"SINGLE_TABLE",您可以在doctrine-project查看。