2012-05-28 15 views
7

मैं Doctrine2 में निम्न पदानुक्रम करना चाहते हैं:सिद्धांत 2 में कक्षाओं के बीच एकाधिक सीटीआई (कक्षा तालिका विरासत)?

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

लेकिन जब मैं Symfony 2 में संस्थाओं जनरेट करने का प्रयास मैं निम्न त्रुटि हो:

[Doctrine\ORM\Mappin\MappingException]
Entity 'Acme\HelloBundle\Entity\FailedSMS' has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported.

मुझे लगता है कि क्योंकि id की है FailedSMS (Message से विरासत में मिला) यह इस तथ्य के साथ संघर्ष में है कि FailedSMS स्वयं को सीटीआई (SMS के साथ) काम करने के लिए id असाइन किया जाना चाहिए।

मैं चंद्रमा के लिए पूछ रहा हूं या इसे काम करने का कोई तरीका है? पदानुक्रम के एक छोटी सी अवलोकन:

/** 
* @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 {} 

उत्तर

3

मुझे ऐसा लगता है कि आप वास्तव में तालिका "संदेश" जरूरत नहीं है। अगर ऐसी बात है, तो आप एक मैप किए गए सुपर वर्ग

<?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 आप स्थापित करने के लिए एसएमएस कक्षाओं के लिए है की आवश्यकता के रूप में संदेश परिभाषित करना चाहिए।

/** 
* @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 {} 

यह एक परीक्षण उत्तर नहीं है, इसलिए मुझे यकीन नहीं है कि आपको इसके साथ समस्याएं हैं या नहीं।

+0

धन्यवाद। मैप किए गए सुपरक्लास ठीक लगते हैं क्योंकि मुझे वास्तव में संदेश इकाई की आवश्यकता या उपयोग करने की आवश्यकता नहीं है। मैं इसका परीक्षण करने जा रहा हूँ। – gremo