2012-02-27 16 views
9

symfonyフレームワークは、php経由でいくつかのメンテナンスタスクを実行できるapp/consoleファイルを備えています。ユーザーはDQLクエリを実行することもできます。Doctrineは特定のフィールドを選択できません

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id, u.nameFirst, u.nameLast FROM DatabaseBundle:User u' 
array 
    0 => 
    array 
     'id' => string '1' (length=1) 
     'nameFirst' => string 'jaroslav' (length=8) 
     'nameLast' => string 'rakhmatoullin' (length=13) 
    1 => 
    array 
     'id' => string '2' (length=1) 
     'nameFirst' => string 'Båb Kåre' (length=10) 
     'nameLast' => string 'Ytrefoss' (length=8) 

3つの特定の列を選択したことを確認してください。私が抱えている問題は、2つのテーブルが結合されていると、同様のクエリでエラーが発生するということです。

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r' 

    [Doctrine\ORM\Query\QueryException]     
    [Semantical Error] line 0, col -1 near 'SELECT u.id ,': 
    Error: Cannot select entity through identification variables 
    without choosing at least one root entity alias. 

全体のユーザーが自分の役割で参加し、次のリターン:明らか

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u, r FROM DatabaseBundle:User u JOIN u.roles r' 

、私は何かが欠けています。

アイデア?適切なドキュメントへのリンクも(この特定の問題については)感謝します。 documentation on "Partial Object Syntax"から

+1

私は非常によく、エラーメッセージを理解していないが、私は同様のエラーメッセージを経験し、そしてr.idを選択することで、私の問題を解決思い出し、私はあなたがより多くのフィールドを選択してみてくださいべきだと思います。 – greg0ire

+1

これはどう? '' SELECT u.id、r。* FROM DatabaseBundle:User u JOIN u.roles r'' – jere

+1

greg0ireは正しいです。私はあなたがそのようなクエリで単一のフィールドと "エンティティ"オブジェクトを選択することはできないと思う。 – jere

答えて

28

デフォルトでは、あなたが教義でDQLクエリを実行し、特定のエンティティのフィールドのサブセットのみを選択したときに、あなたが戻ってオブジェクトを受信しません。代わりに、SQLを直接使用していくつかのデータを結合した場合と同様に、配列だけをフラットな長方形の結果セットとして受け取ります。

部分オブジェクトを選択する場合は、部分 DQLキーワードを使用できます。

php console doctrine:query:dql --hydrate array \ 
    'SELECT partial s.{name ,id}, partial c.{name, id } 
    FROM DatabaseBundle:ProductCategories c 
    JOIN c.suppliers s ORDER BY s.name, c.name' 
+1

注意:プライマリキー部分的なクエリで - それ以外の場合は、厄介なエラーが発生します。 –

+2

2年後、自分の答えは分かりませんが、正しく覚えていれば、すべての製品カテゴリが「c」としてマッピングされ、すべてのカテゴリが「s」としてマップされています。すべてのカテゴリには、ProductCategoriesクラスの「@ annotated-join」によってマッピングされたサプライヤがあります。すべてのアップ投票に感謝します。私は10で十分だと思う。 –

+1

しかし、本当に完全なオブジェクトを戻したいのであれば?つまり、オブジェクトAのフィールドとオブジェクトBの全体のインスタンスを意味しますか? –

関連する問題