我想实现一个非常简单的查询理论,但我没有设法使它的工作: 我想活动CV的数量按Elo分组(这是一个属性在一个遗传表)。通过关系表查询继承表
错误:
[Semantical Error] line 0, col 22 near 'elo FROM MyNamespace\CvBundle\Entity\Cv'
: Error: Class MyNamespace\CvBundle\Entity\Cv\Feature has no field or association named 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;
....
感谢您的帮助
好吧,我不是很确信,因为这意味着我必须在Feature类中编写** ALL **子类属性(我没有将它们粘贴到stackoverflow中),所以基本上我们松散使用Doctrine继承的好处。 –
解决方法有效,但我真的不喜欢它(因为这意味着我必须复制父类中的所有子类属性)。无论如何。感谢您解决找到另一个* clean *解决方案的解决方法 –
您仍然拥有多个相关类共享一个表的优势。 SQL本身没有的东西。所以它的唯一的sql事情就像这样会导致问题。你已经需要在你的基类中列出所有的派生类,所以不得不添加所有的属性也许不是那么糟糕。 – Cerad