gre*_*emo 7 doctrine symfony doctrine-orm
我想在Doctrine2中使用以下层次结构:
- Message
- SMS
- SentSMS
- ScheduledSMS
- FailedSMS
- Newsletter
- SystemComunication
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在Symfony 2中生成实体时,我收到以下错误:
[Doctrine\ORM\Mappin\MappingException]
实体'Acme\HelloBundle\Entity\FailedSMS'具有复合标识符,但使用除手动分配(身份,序列)之外的ID生成器.这不受支持.
我想这是因为id
中FailedSMS
(从继承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 {}
Run Code Online (Sandbox Code Playgroud)
在我看来,你实际上并不需要表“消息”。如果是这种情况,您应该将 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
*/
}
Run Code Online (Sandbox Code Playgroud)
现在,您需要设置的唯一 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 {}
Run Code Online (Sandbox Code Playgroud)
这不是经过测试的回复,所以我不确定您是否会遇到问题。
归档时间: |
|
查看次数: |
2082 次 |
最近记录: |