Doctrine2 - 我如何通过辨别器列进行排序? [英] Doctrine2 - How can I order by a discriminator column?

查看:95
本文介绍了Doctrine2 - 我如何通过辨别器列进行排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个很直截了当的设置,
我有不同的类型的付款明细,
它可以是信用卡(CC)还是借记订单(DO)。



所以我实现了单表继承映射策略要实现这一点,
但是当我尝试通过discriminator列进行排序时,问题现在出现,因为鉴别器列不在基类中。



存储库函数:

  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
和cp.client_contact_id =:client_conta ct_id
GROUP BY pd.id
ORDER BY pd.method_type'; //由于pd.method_type是鉴别器列,我无法通过它排序。我需要能够。

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

Base PaymentDetail实体:

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

class PaymentDetail实现PaymentDetailInterface
{

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

/ *等... * /
}

借方订单PaymentDetail实体:

  / ** 
* AccountingBundle\Entity\DOPaymentDetail
*
* @ ORM\Table(name =PaymentDetails)
* @ ORM\Entity
* /
class DOPaymentDetail扩展PaymentDetail实现DOPaymentDetailInterface
{

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

/ *等... * /
}

信用卡付款细节实体:

  / ** 
* AccountingBundle\Entity\CCPaymentDetail
*
* @ ORM\Table(name =PaymentDetails)
* @ ORM\Entity
* /
class CCPaymentDetail扩展PaymentDetail实现CCPaymentDetailInterface
{

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

/ *等... * /
}

当我尝试这样,我得到这个错误,

 错误:类AccountingBundle\Entity\PaymentDetail没有名称的字段或关联method_type)


解决方案

这似乎是最简单的解决方案远程)是向基类添加另一个字段并复制鉴别器列值。



上述 TYPE(q)仅在WHERE子句中工作。


How should I go about ordering by a discriminator column in a doctrine repository query?

I have a pretty straight forward setup, I have different types of payment details, it can either be Credit Card (CC) or Debit Order (DO).

So I've implemented a single table inheritance mapping strategy to achieve this, but the problem now comes in when I try to order by the discriminator column, since the discriminator column isn't present in the base class.

The repository function:

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

Base PaymentDetail entity:

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

Debit Order PaymentDetail entity:

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

Credit Card PaymentDetail entity:

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

When I try that, I get this error,

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

解决方案

It seems like the simplest solution (so far) is to add another field to the base class and copy the discriminator column value.

The aforementioned TYPE(q) works only in WHERE clause.

这篇关于Doctrine2 - 我如何通过辨别器列进行排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆