2013-10-16 13 views
13

Wie sollte ich über eine Diskriminatorspalte in einer Doktrin-Repository-Abfrage sortieren?Doctrine2 - Wie kann ich mit einer Diskriminatorspalte bestellen?

Ich habe einen ziemlich geradlinig Setup, ich verschiedene Arten von Zahlungsdetails habe, es entweder mit Kreditkarte (CC) oder Abbuchungsauftrag (DO) sein kann.

Also habe ich eine einzige Tabelle Vererbung Mapping-Strategie implementiert, um dies zu erreichen, aber das Problem kommt jetzt, wenn ich versuche, durch die Diskriminator-Spalte zu bestellen, da die Diskriminator-Spalte nicht in der Basisklasse vorhanden ist.

Die Repository-Funktion:

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(); 
} 

Basis PaymentDetail Einheit:

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

Abbuchungsauftrag PaymentDetail Einheit:

/** 
* 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... */ 
} 

Kreditkarte PaymentDetail Einheit:

Wenn ich versuche, dass ich diesen Fehler,

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

schauen Sie sich Ihre discriminator-column -Deklaration '* @DiscriminatorColumn (name =" PaymentMethodType "' an und prüfen Sie, wie der Name der generierten Spalte in Ihrer Datenbank ist ... Ich bin ziemlich sicher, dass der Spalten-/Feldname 'ist PaymentMethodType "und nicht" method_type ". Kannst du das bestätigen? – nifr

+0

Ich kann das bestätigen. Aber, das Problem kommt immer herein, wenn ich versuche, durch eine Spalte zu bestellen, die technisch in Doctrine's Augen nicht existiert, habe ich versucht, method_type zu PaymentMethodType zu ändern in der Repo-Funktion, und ich habe ... '(" [Semantische Fehler] Zeile 0, Spalte 388 in der Nähe von 'PaymentMethodType': Fehler: 'PaymentMethodType' ist nicht definiert. ")' – Odyss3us

+0

haben Sie eine Lösung dafür gefunden? – loostro

Antwort

0

Kann Ihr Versuch TYPE() oder INSTANCE OF benutzen?

verwandte: https://groups.google.com/forum/#!topic/doctrine-user/JtCbwuN-37o

Allerdings ist dieses Thema nicht sagen, wenn es umgesetzt wird oder nicht. Zu der Zeit, als es geschrieben wurde, sagte jemand, Ordnung würde nicht funktionieren.

$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

es funktioniert nicht (neueste Doktrin2) – loostro

+0

TYPE() ist immer noch nicht implementiert AFAIK – caponica

1

Es ist wie die einfachste Lösung scheint (bisher) ist ein weiteres Feld der Basisklasse aufzuwerten und den Diskriminator Spalte Wert kopieren.

Die oben genannte TYPE(q) funktioniert nur in WHERE-Klausel.

Verwandte Themen