理論的には非常に単純なクエリを実現したいのですが、うまくいきませんでした: Elo (継承されたテーブルの属性) でグループ化されたアクティブな CV の数が必要です。
エラー:
[Semantical Error] line 0, col 22 near 'elo FROM MyNamespace\CvBundle\Entity\Cv':
エラー: クラス MyNamespace\CvBundle\Entity\Cv\Feature には、elo という名前のフィールドまたは関連付けがありません。
MyNamespace\CvBundle\Entity\Cv\Feature
「マスター」テーブルであるため、真のフィールドがないことについて不平を言っています。このフィールドはMyNamespace\CvBundle\Entity\Cv\Lol
、継承されたテーブルである に含まれていますCv\Feature
クエリは次のとおりです。
// CvRepository.php
public function getStats()
{
$query = $this->createQueryBuilder('c')
->select('COUNT(f.id), f.elo')
->leftJoin('c.feature', 'f')
->groupBy('f.elo')
->where('f INSTANCE OF MyNameSpace\CvBundle\Entity\Cv\Lol')
->andWhere('c.active = :active')
->andWhere('c.expiresAt > :now')
->setParameters(array(
'now' => new \DateTime("now"),
'active' => 1,
))
->getQuery();
return $query->execute();
}
そして、テーブル Cv:
// Cv.php
/**
* @ORM\Table(name="cv")
* @ORM\Entity(...)
*/
class Cv
{
/**
* @ORM\OneToOne(targetEntity="MyNameSpace\CvBundle\Entity\Cv\Feature", cascade={"all"})
*/
protected $feature;
}
Feature.php
/**
* @ORM\Entity()
* @ORM\Table(name="cv_feature")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"lol" = "Lol", ...})
*/
abstract class Feature
{
/**
* @ORM\OneToOne(targetEntity="MyNameSpace\CvBundle\Entity\Cv")
* @ORM\JoinColumn(name="cv_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $cv;
そして、Lol.php
/**
* @ORM\Entity()
*/
class Lol extends Feature
{
/**
* @var integer $elo
*
* @ORM\Column(name="elo", type="string")
*/
private $elo;
....