0

我将继承与 Doctrine 2.1 一起使用:

Fiche 是主实体,Artist 是从 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 ......这听起来很糟糕,因为它是同一个对象!

4

2 回答 2

2

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

但最后似乎:

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

是解决方案。

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

从 MyAppFicheBundle 中选择计数(abonnement):Abonnement abonnement WHERE abonnement.fiche = Miles Davis

[语法错误] line 0, col 100: Error: Expected end of string, got 'Davis'

于 2012-11-02T14:02:06.160 回答
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')
;
于 2012-11-02T08:14:20.277 回答