有一个类型/表EveryoneNeedsMe
/ everyone_needs_me
(在我的具体情况下,它是Message
/ messages
)。实际上有多种类型/表,需要它,例如Foo
/ foo
或Bar
/ 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.
一些ORM(例如Eloquent,s。docu)支持多态关系模式。 Doctrine 2也支持它吗?
如果是:如何在Doctrine 2中使用它?如果否:如何使用Doctrine处理此案例?
答案 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
}
您的班级Foo
和Bar
会延长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查看。