Doctrine2继承和querybuilder

时间:2012-11-01 20:33:53

标签: inheritance symfony doctrine-orm class-table-inheritance

我正在使用继承与Doctrine 2.1:

Fiche是主要实体 和艺术家来自Fiche

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

这是Abonnement ORM的定义:

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”类型。

所以我想我必须从我的艺术家那里取出Fiche ......这听起来很糟糕,因为它是同一个对象!

2 个答案:

答案 0 :(得分:1)

感谢您的回答,让我更接近解决方案,

但最后似乎是:

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

是解决方案。

这是正常的吗?我认为ID的映射是自动的,但如果我不使用getId()它返回我的Fiche的toString()版本并生成:

  

SELECT COUNT(abonnement)FROM MyAppFicheBundle:Abonnement abonnement   abEREment.fiche = Miles Davis

     

[语法错误]第0行,第100栏:错误:字符串的预期结束,得到'戴维斯'

答案 1 :(得分:0)

$qb->where接受字符串(DQL)或查询生成器表达式。

在您的情况下,请将行替换为:

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

我也会改写这样的开头:

$qb = $this->_em->createQueryBuilder()
    ->select($qb->expr()->count('abonnement'));
    ->from('TeeltFicheBundle:Abonnement', 'abonnement')
;