Подтвердить что ты не робот

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") 
4b9b3361

Ответ 1

Похоже, что самым простым решением (до сих пор) является добавление другого поля в базовый класс и копирование значения столбца дискриминатора.

Вышеупомянутый TYPE(q) работает только в предложении WHERE.

Ответ 2

Может ли ваша попытка использовать 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)';