Doctrine2 Наследование и построитель запросов

Я использую Наследование с Doctrine 2.1:

Fiche является главной сущностью, а Artist является производным от Fiche.

итак: Фиш -> Художник

тогда у меня есть этот метод, в другом хранилище под названием Abonnement:

public function getCountAbonnes(\MyApp\FicheBundle\Entity\Fiche $fiche){

    $qb = $this->_em->createQueryBuilder();

    $qb->add('select', $qb->expr()->count('abonnement'));
    $qb->from('\Teelt\FicheBundle\Entity\Abonnement', 'abonnement');

    // !!!! this line is the problem !!!!
    $qb->where('fiche', $fiche);

    return $qb->getQuery()->getSingleScalarResult();
}

Вот определение ORM Abonnement:

MyApp\FicheBundle\Entity\Abonnement:
    type: entity
    repositoryClass: MyApp\FicheBundle\Repository\AbonnementRepository
    table: abonnement

    # many fiche for many users
    manyToOne:
      user:
        targetEntity: MyApp\UserBundle\Entity\User
        inversedBy: abonnements
      fiche:
        targetEntity: MyApp\FicheBundle\Entity\Fiche
        inversedBy: abonnements

# etc ...

У меня проблема в том, что я всегда передаю сущность Artist вместо Fiche, и получаю эту ошибку:

Выражение типа 'Teelt\FicheBundle\Entity\Artist' не допускается в этом контексте.

Так что я думаю, что должен получить Фиш от моего Артиста... который звучит плохо, так как это тот же объект!

2 ответа

Решение

Спасибо за ваш ответ, это приблизило меня к решению,

но в итоге кажется, что:

$qb->where($qb->expr()->eq('abonnement.fiche', $fiche->getId() ));

было решение.

Это нормально? Я думал, что сопоставление идентификатора будет автоматическим, но если я не использую getId(), он возвращает версию моего Fiche toString() и генерирует:

ВЫБЕРИТЕ COUNT(abonnement) ОТ MyAppFicheBundle: Абонентское абонентское ГДЕ abonnement.fiche = Miles Davis

[Синтаксическая ошибка] строка 0, столбец 100: ошибка: ожидаемый конец строки, получен "Дэвис"

$qb->where принимает строку (DQL) или выражение Query Builder.

В вашем случае замените строку на:

$qb->where($qb->expr()->eq('abonnement.fiche', $fiche));

Я также переписал бы начало так:

$qb = $this->_em->createQueryBuilder()
    ->select($qb->expr()->count('abonnement'));
    ->from('TeeltFicheBundle:Abonnement', 'abonnement')
;
Другие вопросы по тегам