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

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生成器.这不受支持.

我想这是因为idFailedSMS(从继承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)

Pet*_*ley 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
   */
}
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)

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