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')
;