2

ここでは非常に単純なことをしようとしていますが、まだDQLを取得できないようです。さらに、グーグルは、私が「DQL」と入力したときに「SQL」の結果を返すことによって、私の一日を困難にすることにしました。

さまざまなプロパティを持つArticleエンティティがあります。それらの1つは、関連付けられたImageエンティティです。

/**
 * @ORM\ManyToOne(targetEntity="Image", inversedBy="articles")
 */
protected $image;

さて、遅延読み込みとそれが生成する不要な読み込みを防ぐために、 Article.titleとArticle.imageを取得してこれを実行したいと思います。記事の名前とそれに関連する画像(画像エンティティ全体)。

それ、どうやったら出来るの?何かが実際に機能し、なぜそれが機能するのか、他のことが機能しないのかを調べることができることを期待して、思いついたすべてを試しましたが、うまく機能させることができません。

これが私が思いついたクエリの最も正しいバージョンですが、それが機能する場合に限ります。

public function getTitleBackground($id)
{
    $qb = $this->createQueryBuilder('a')
               ->select('a.title, a.id', 'i')
               ->leftJoin('a.image', 'i')
               ->where('a.id = :id')
               ->setParameter('id', $id);

    return $qb->getQuery()->getResult();
}

これは私にこのエラーを返します:

テンプレートのレンダリング中に例外がスローされました(「[SemanticalError] line 0、col -1 near'SELECT a.title、':Error:Cannot select entity through the Identification Variableswithout少なくとも1つのルートエンティティエイリアスを選択する必要があります。」 )PIFlexBlogBu​​ndle:Admin / Page:commentEdit.html.twigの13行目

aこれは、追加すると「修正」されます->select()が、すべての記事フィールドが選択されます。これは、回避しようとしているものです。

注:私はこれをsymfony2リポジトリクラス内で使用しています。

4

2 に答える 2

1

AdrienBraultの回答のおかげで、なんとかクエリを実行できました。

public function getTitleBackground()
{
    // Pure DQL
    $q = $this->getEntityManager()->createQuery('SELECT partial a.{id,title} FROM PIFlexBlogBundle:Article a JOIN a.image i');

    // OOP building DQL through queryBuilder
    $qb = $this->createQueryBuilder('a')
               ->select('partial a.{id, title}')
               ->join('a.image', 'i');

    return $qb->getQuery()->getResult();
}

生のDQLとクエリビルダーを介して作成されたDQLはどちらも同じ結果になります。

これはすべての記事を返すことに注意してください。idで取得するには WHERE句を追加するだけです。

于 2013-01-11T12:45:14.500 に答える
1

DQL部分オブジェクト構文を使用する:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#partial-object-syntax

于 2013-01-11T11:39:14.440 に答える