2013-10-16 66 views
13

我應該如何處理由教義存儲庫查詢中的鑑別器列進行排序?Doctrine2 - 如何通過鑑別器列進行排序?

我有一個非常簡單的設置, 我有不同類型的付款細節, 它可以是信用卡(CC)或借記訂單(DO)。

所以我已經實現了一個單表繼承映射策略來實現這個, 但現在問題出現在我嘗試按鑑別器列排序時,因爲鑑別器列不在基類中。

的庫函數:

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

看看你的鑑別器列聲明* @ DiscriminatorColumn(name =「PaymentMethodType」,並檢查數據庫中生成的列的名稱是什麼......我很確定column-/field-name是' PaymentMethodType'而不是'method_type'。你可以證實這一點嗎? – nifr

+0

我可以證實這一點。但是,當我嘗試按照Doctrine眼中不存在的專欄進行排序時,問題一直存在,我嘗試將method_type更改爲PaymentMethodType在repo函數中,我得到了......'(「[Semantical Error] line 0,col 388 near'PaymentMethodType':Error:'PaymentMethodType'is not defined。」) – 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

TYPE()仍未實現AFAIK – caponica

1

看來最簡單的解決方案(到目前爲止)是將另一個字段添加到基類並複製鑑別器列值。

上述TYPE(q)只適用於WHERE子句。

相關問題