教义2中的类之间的多个CTI(类表继承)?
Posted
技术标签:
【中文标题】教义2中的类之间的多个CTI(类表继承)?【英文标题】:Multiple CTI (Class Table Inheritance) among classes in Doctrine 2? 【发布时间】:2012-05-28 16:19:28 【问题描述】:我希望在 Doctrine2 中有以下层次结构:
- Message
- SMS
- SentSMS
- ScheduledSMS
- FailedSMS
- Newsletter
- SystemComunication
但是当我尝试在 Symfony 2 中生成实体时,我收到以下错误:
[Doctrine\ORM\Mappin\MappingException] 实体 'Acme\HelloBundle\Entity\FailedSMS' 有一个复合标识符 但使用 ID 生成器而不是手动分配(身份, 顺序)。这不受支持。
我认为这是因为FailedSMS
的id
(继承自Message
)与FailedSMS
本身应该有一个分配的id
以使CTI(带有SMS
)的事实相冲突工作。
我是在寻求月球还是有办法让它发挥作用?层次结构的一点概述:
/**
* @ORM\Entity
* @ORM\Table(name="message")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap("newsletter" = "Newsletter", "sms" = "SMS")
*/
class Message
/**
* @ORM\Entity
* @ORM\Table(name="newsletter")
*/
class Newsletter extends Message
/**
* @ORM\Entity
* @ORM\Table(name="sms")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="status", type="string")
* @ORM\DiscriminatorMap("sent"="SentSMS", "scheduled"="ScheduledSMS",
* "failed"="FailedSMS"
* )
*/
class SMS extends Message
/**
* @ORM\Entity
* @ORM\Table(name="failed_sms")
*/
class FailedSMS extends SMS
【问题讨论】:
【参考方案1】:在我看来,您实际上并不需要表格“消息”。如果是这种情况,您应该将 Message 定义为映射的超类
<?php
namespace Your\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\MappedSuperClass
*
*/
abstract class MappedSuperClassMessage
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* Get id
*
* @return integer
*/
public function getId()
return $this->id;
/**
* Everything else you want the subclasses to have
*/
现在您需要设置的唯一 CTI 是 SMS 类。
/**
* @ORM\Entity
* @ORM\Table(name="newsletter")
*/
class Newsletter extends MappedSuperClassMessage
/**
* @ORM\Entity
* @ORM\Table(name="sms")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="status", type="string")
* @ORM\DiscriminatorMap("sent"="SentSMS", "scheduled"="ScheduledSMS",
* "failed"="FailedSMS"
* )
*/
class SMS extends MappedSuperClassMessage
/**
* @ORM\Entity
* @ORM\Table(name="failed_sms")
*/
class FailedSMS extends SMS
这不是经过测试的回复,所以我不确定您是否会遇到问题。
【讨论】:
谢谢。映射的超类似乎很好,因为我真的不需要或使用 Message 实体。我要测试一下。以上是关于教义2中的类之间的多个CTI(类表继承)?的主要内容,如果未能解决你的问题,请参考以下文章