Doctrine 2中的类之间有多个CTI(类表继承)?

时间:2012-05-28 16:19:29

标签: symfony doctrine doctrine-orm

我想在Doctrine2中使用以下层次结构:

- Message
    - SMS
        - SentSMS
        - ScheduledSMS
        - FailedSMS
    - Newsletter
    - SystemComunication

但是当我尝试在Symfony 2中生成实体时,我收到以下错误:

  

[学说\ 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 {}

1 个答案:

答案 0 :(得分:3)

在我看来,你实际上并不需要表“消息”。如果是这种情况,则应将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 {}

这不是经过测试的回复,因此我不确定您是否会遇到问题。