1

我想在理论上实现一个非常简单的查询,但我没有设法让它工作:我想要按 Elo 分组的活动 CV 的数量(这是继承表中的一个属性)

错误:

[语义错误] 第 0 行,第 22 列,靠近 '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;

....
4

1 回答 1

1

很确定您将不得不将 $elo 移动到您的要素类。

您的“where instance of”会将结果限制为 Lol 类,但我怀疑 DQl 是否足够聪明,能够意识到所有功能都将成为 lol 的。

您可能可以将 Cv 更改为指向 Lol,但这也可能不是您想要的。

您还可以在 php.ini 中实现 group by。

但是试试这个并验证它是否有效:

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;

你只会在你的 Lol 类上放置 elo 的 getter/setter。所以它基本上对它的兄弟姐妹来说是隐藏的。无论如何,它已经在数据库表中了。您甚至可以将其保密并仅将其添加到 Lol 中,这样兄弟姐妹就根本无法访问它。对此不确定,但我认为教义可能仍会对其进行补充。

于 2013-08-22T14:46:36.573 回答