1

理論的には非常に単純なクエリを実現したいのですが、うまくいきませんでした: 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;

....
4

1 に答える 1

1

$elo を Feature クラスに移動する必要があることは間違いありません。

あなたの「where instance of」は結果を Lol クラスに制限しますが、DQl がすべての機能が lol になることを認識するのに十分スマートであるかどうかは疑問です。

おそらく Cv を変更して Lol を指すようにすることもできますが、それもおそらくあなたが望むものではありません。

group by を 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;

Lol クラスには、elo のゲッター/セッターのみを配置します。そのため、基本的に兄弟から隠されています。とにかく、それはすでにデータベーステーブルにあるでしょう。兄弟がまったくアクセスできないように、それを非公開にして Lol のみに追加することもできます。それについてはわかりませんが、教義はまだそれを水和させるかもしれないと思います.

于 2013-08-22T14:46:36.573 に答える