2013-10-16 3 views
13

मुझे एक डॉक्टरेट रिपोजिटरी क्वेरी में भेदभावकर्ता कॉलम द्वारा ऑर्डर करने के बारे में कैसे जाना चाहिए?सिद्धांत 2 - मैं भेदभावकर्ता कॉलम द्वारा कैसे आदेश दे सकता हूं?

मेरे पास एक बहुत सीधी आगे सेटअप है, मेरे पास विभिन्न प्रकार के भुगतान विवरण हैं, या तो यह क्रेडिट कार्ड (सीसी) या डेबिट ऑर्डर (डीओ) हो सकता है।

इसलिए मैंने इसे प्राप्त करने के लिए एक एकल टेबल विरासत मानचित्रण रणनीति लागू की है, लेकिन समस्या तब आती है जब मैं भेदभावकर्ता कॉलम द्वारा आदेश देने का प्रयास करता हूं, क्योंकि भेदभावकर्ता कॉलम बेस क्लास में मौजूद नहीं है।

भंडार समारोह:

public function getPaymentDetails (ClientContactInterface $clientContact) 
{ 
    $dql = 'SELECT pd 
      from 
      AccountingBundle:PaymentDetail pd 
      JOIN ClientProductBundle:ClientProduct cp 
      WITH cp.payment_detail_id = pd.id 
      WHERE 
      cp.payment_detail_id = pd.id 
      and cp.client_contact_id = :client_contact_id 
      GROUP BY pd.id 
      ORDER BY pd.method_type'; // Since pd.method_type is the discriminator column, I cannot order by it. And I need to be able to. 

    $em = $this->getEntityManager(); 
    $query = $em->createQuery($dql)->setParameter('client_contact_id', $clientContact->getId()); 
    return $query->getResult(); 
} 

बेस PaymentDetail इकाई:

/** 
* @ORM\Entity(repositoryClass="AccountingBundle\Repository\PaymentDetailRepository") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\Table(name="PaymentDetails") 
* @ORM\DiscriminatorColumn(name="PaymentMethodType", type="string") 
* @ORM\DiscriminatorMap({ "DO" = "DOPaymentDetail", "CC" = "CCPaymentDetail"}) 
*/ 

class PaymentDetail implements PaymentDetailInterface 
{ 

    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /* etc... */ 
} 

डेबिट आदेश PaymentDetail इकाई:

/** 
* AccountingBundle\Entity\DOPaymentDetail 
* 
* @ORM\Table(name="PaymentDetails") 
* @ORM\Entity 
*/ 
class DOPaymentDetail extends PaymentDetail implements DOPaymentDetailInterface 
{ 

    /** 
    * @var string $account_holder 
    * 
    * @ORM\Column(name="DOAccountHolder", type="string", length=255) 
    */ 
    protected $account_holder; 

    /* etc... */ 
} 

क्रेडिट कार्ड PaymentDetail इकाई:

/** 
* AccountingBundle\Entity\CCPaymentDetail 
* 
* @ORM\Table(name="PaymentDetails") 
* @ORM\Entity 
*/ 
class CCPaymentDetail extends PaymentDetail implements CCPaymentDetailInterface 
{ 

    /** 
    * 
    * @var string $card_holder 
    * 
    * @ORM\Column(name="CCCardHolder", type="string", length=255) 
    */ 
    protected $card_holder; 

    /* etc... */ 
} 

जब मैं कोशिश है कि, मैं इस त्रुटि मिलती है,

Error: Class AccountingBundle\Entity\PaymentDetail has no field or association named method_type") 
+0

अपने भेदभावकर्ता-कॉलम घोषणा '* @ डिस्क्रिमिनेटर कॉलम (नाम = "भुगतान विधि विधि" पर ध्यान दें और जांचें कि आपके डेटाबेस में जेनरेट किए गए कॉलम का नाम क्या है ... मुझे पूरा यकीन है कि कॉलम-/फ़ील्ड-नाम ' PaymentMethodType' और 'method_type' नहीं। क्या आप इसकी पुष्टि कर सकते हैं? – nifr

+0

मैं इसकी पुष्टि कर सकता हूं। लेकिन, समस्या तब आती रहती है जब मैं कॉलम द्वारा ऑर्डर करने का प्रयास करता हूं जो तकनीकी रूप से सिद्धांत की आंखों में मौजूद नहीं है, मैंने MethodMtype को methodMethodType में बदलने का प्रयास किया रेपो फ़ंक्शन में, और मुझे मिल गया ... '(" [सेमेन्टिकल एरर] लाइन 0, 'भुगतान विधि विधि' के पास कर्नल 388: त्रुटि: 'भुगतान विधि विधि' परिभाषित नहीं है। ") – Odyss3us

+0

क्या आपको इसके लिए कोई समाधान मिला? – loostro

उत्तर

0

अपने कोशिश TYPE() या INSTANCE OF उपयोग करने के लिए कर सकते हैं?

संबंधित: https://groups.google.com/forum/#!topic/doctrine-user/JtCbwuN-37o

हालांकि, इस विषय कहना नहीं है अगर यह या लागू नहीं है। उस समय यह लिखा गया था कि कोई काम नहीं करेगा।

$dql = 'SELECT pd 
     from 
     AccountingBundle:PaymentDetail pd 
     JOIN ClientProductBundle:ClientProduct cp 
     WITH cp.payment_detail_id = pd.id 
     WHERE 
     cp.payment_detail_id = pd.id 
     and cp.client_contact_id = :client_contact_id 
     GROUP BY pd.id 
     ORDER BY TYPE(pd)'; 
+0

यह काम नहीं करता है (नवीनतम doctrin2) – loostro

+0

प्रकार() अभी भी लागू नहीं है AFAIK – caponica

1

ऐसा लगता है कि सबसे सरल समाधान (अब तक) बेस क्लास में एक और फ़ील्ड जोड़ने और भेदभावकर्ता कॉलम मान की प्रतिलिपि बनाना है।

उपरोक्त TYPE(q) केवल WHERE खंड में काम करता है।

संबंधित मुद्दे