Doctrine2 - Jak mogę zamówić przez kolumnę dyskryminatora?
Jak powinienem przejść do porządkowania przez kolumnę dyskryminatora w zapytaniu repozytorium doktryny?
Mam dość prostą konfigurację, mam różne rodzaje szczegółów płatności, może to być karta kredytowa (CC) lub polecenie zapłaty (DO).
Aby to osiągnąć, zaimplementowałem strategię mapowania dziedziczenia dla pojedynczej tabeli, ale problem pojawia się teraz, gdy próbuję zamówić przez kolumnę dyskryminatora, ponieważ kolumna dyskryminująca nie występuje w klasie bazowej.
Funkcja repozytorium:
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();
}
Podstawowa jednostka płatności:
/**
* @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... */
}
Jednostka Płatności Polecenia Zapłaty:
/**
* 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... */
}
Jednostka płatności kartą płatniczą:
/**
* 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... */
}
Kiedy to próbuję, otrzymuję ten błąd,
Error: Class AccountingBundle\Entity\PaymentDetail has no field or association named method_type")