2013-08-22 59 views
1

我想实现一个非常简单的查询理论,但我没有设法使它的工作: 我想活动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; 

.... 

感谢您的帮助

回答

1

敢肯定你会移动$ ELO到要素类。

你'哪里的实例'将限制结果为Lol类,但我怀疑DQl是否足够聪明,认识到所有功能都将是大声笑。

你可能会改变Cv指向LOL,但那可能不是你想要的。

你也可以在php中实现该组。

但是试试这个,并验证它的工作原理:

abstract class Feature 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="MyNameSpace\CvBundle\Entity\Cv") 
    * @ORM\JoinColumn(name="cv_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    private $cv; 

    /** 
    * @var integer $elo 
    * 
    * @ORM\Column(name="elo", type="string") 
    */ 
    protected $elo; 

你只把的getter/setter方法ELO对你大声笑类。所以它基本上是从它的兄弟姐妹隐藏的。无论如何,它已经在数据库表中了。你甚至可以把它保留为私有的,并将其添加到Lol中,以便兄弟姐妹根本无法访问它。对此不确定,但我认为教义可能仍然会滋润它。

+0

好吧,我不是很确信,因为这意味着我必须在Feature类中编写** ALL **子类属性(我没有将它们粘贴到stackoverflow中),所以基本上我们松散使用Doctrine继承的好处。 –

+0

解决方法有效,但我真的不喜欢它(因为这意味着我必须复制父类中的所有子类属性)。无论如何。感谢您解决找到另一个* clean *解决方案的解决方法 –

+0

您仍然拥有多个相关类共享一个表的优势。 SQL本身没有的东西。所以它的唯一的sql事情就像这样会导致问题。你已经需要在你的基类中列出所有的派生类,所以不得不添加所有的属性也许不是那么糟糕。 – Cerad