1

ドクトリンでクエリを設定しましたが、それが想定されていることを行うと確信しています...複数のテーブルを結合するため、外部キーを介してデータを取得するために余分なクエリをスキップできます。

$posts = $this->getDoctrine()->getManager()
        ->createQuery('
            SELECT a AS article, COUNT(c) AS comments
            FROM ArticleBundle:Article a
                LEFT JOIN CommentsBundle:Comment c WITH (c.article = a.id)
                LEFT JOIN ImageBundle:Image i WITH (i.id = a.image)
            GROUP BY a.id
            ORDER BY a.timestamp DESC
        ')
        ->getResult();

次のように、データに正常にアクセスできます。

{% for post in posts %}
<div id="news-story">
 <div class="title">{{ post.article.title }}</div>
 <div class="comments">{{ post.comments }}</div>
 ...
{% endfor %}

問題は、2 番目の列 (「i AS イメージ」) をフィールド リストに追加するとすぐに失敗することです。次のメッセージが表示されます...

「配列」のアイテム「記事」は存在しません...

...そして、私はその理由を完全には理解できません。{{ post.article.title }} や {{ post.image.path }} などの変数にアクセスできることを願っています (ちなみに存在します)...しかし、できません。

どんな考えでも大歓迎です。

ありがとう!

4

1 に答える 1

2

COUNT(c)...オブジェクトとともにスカラー結果を返すクエリを作成したという事実から、混乱が生じていると思います。

これは、Articleエンティティの配列を返す代わりに、(使用しようとしているpost.image) 予想どおり、実際には連想配列を取得することを意味します。各メンバーには countpost.commentsと article エンティティが含まれますpost.article

nb 記事に関連する画像にアクセスしたい場合は、 を使用する必要がありますpost.article.image

私は試して説明します:

あなたが反復できる記事オブジェクトの配列を期待しています:

array(
    [0] => ArticleEntity,
    [1] => ArticleEntity,
    [2] => ArticleEntity
)

クエリから実際に得られるもの

array(
    [0] => array(
        'article' => ArticleEntity,
        'comments'=> 10
    ),
    [1] => array(
        'article' => ArticleEntity,
        'comments'=> 3
    ),
    [2] => array(
        'article' => ArticleEntity,
        'comments'=> 0
    )
) 

クエリのスカラー部分を削除するCOUNT(c) AS commentsと、最初の例が得られます。そのままにしておくと、2 番目の例が得られます。

純粋/混合結果に関するDoctrineのドキュメントは、これに関する良い読み物/説明です。

補足として、生の SQL を作成する理由はいくつかあります。まず、DQL を使用してクエリを書き直して、Doctrine が提供するいくつかの機能を利用できます。

$qb = $this->getDoctrine()->getManager()->createQueryBuilder();

$qb
    ->select('article', 'image', 'COUNT(comments) as comment_count')
    ->from('ArticleBundle:Article', 'article')
    ->leftJoin('article.comment', 'comments')
    ->leftJoin('article.image', 'image')
    ->groupBy('article.id')
    ->orderBy('article.timestamp', 'DESC')
;

$posts = $qb->getQuery()->getResult();
于 2013-05-16T02:59:41.727 に答える