2011-10-24 19 views
2

Symfony2でDoctrine2を使用してデータベースから関連オブジェクトをプルアップするときに問題が発生します。私は次の関数を使用してカスタムリポジトリがあります。Symfony2カスタムリポジトリ、遅延ロードとプロキシオブジェクト

public function getOrder($id) { 
    $DQL = 'SELECT request, orderer 
    FROM OrderRequestBundle:OrderRequest request 
    JOIN request.orderer orderer 
    WHERE request.id = :id'; 

    $query = $this->getEntityManager()->createQuery($DQL) 
       ->setParameter('id', $id) 
       ->setMaxResults(1); 
    return $query->getResult(); 
} 

を...しかし、私はこの関数を実行したときに、何らかの理由で私は戻ってOrderRequestオブジェクトではなく、OrderRequestの実際のインスタンスのプロキシオブジェクトを取得し、私が行方不明です何か? Doctrine2はレイジーローディングが大好きで、私はそれを手に入れてオブジェクトをフェッチすることはできないようです。

UPDATE:

{{ order.quantity }} 
:ように小枝が「注文」変数に関する情報を呼び出す

$order = $this->getDoctrine() 
    ->getRepository('OrderRequestBundle:OrderRequest') 
    ->getOrder($id); 

return $this->render('OrderRequestBundle:Admin:view.html.twig', array('order' => $order)); 

: 私は単純に以下のコードで小枝テンプレートに情報を表示しようとしています

...しかし、私はこのエラーになってしまう:

Item "quantity" for "Array" does not exist in "OrderRequestBundle:Admin:view.html.twig" at line 5 
+1

そうしない任意の理由をプロキシインスタンスが必要ですか? – Problematic

+0

私は、(Twigテンプレートを介して)ページに表示するOrderRequestオブジェクトに関する情報を取得しようとしていますが、オブジェクトのプロパティが存在しないというエラーが発生し続けます。これを反映するように質問を更新します。 – celestialorb

答えて

8

UPDATE

を参照してください、それはあなたがあなたの$クエリオブジェクトを使用している方法です。

$query->getResult()は結果の配列を返します。このように、結果セットを最大1行に制限している場合、1つのエントリを持つ配列が返されますが、それでも配列は返されます。アクセサーメソッドを自然に使用しようとしているときに、これをつぶやく。

代わりに$query->getSingleResult()を使用してください。クエリーが複数の行を返す場合、Doctrineは一意でない結果例外をスローすることに注意してください。クエリーが複数の結果を返す可能性がある場合は、setMaxResults(1)と同じように使用する必要があります。 reference proxiesのドキュメントから

ENDのUPDATE

Here $item is actually an instance of the proxy class that was generated for the Item class but your code does not need to care. In fact it should not care. Proxy objects should be transparent to your code.

強調彼ら。プロキシはコードに対して透過的で、可能な限りパフォーマンスを向上させるために存在する必要があります。あなたは、クエリの熱心な負荷部分への差し迫った必要性を持っている場合しかし、あなたはどちらかの設定エンティティの設定ファイルにフェッチモードを、またはドキュメントのthis sectionをチェックアウトすることができます:

$query = $em->createQuery("SELECT u FROM MyProject\User u"); 
$query->setFetchMode("MyProject\User", "address", "EAGER"); 
$query->execute(); 
+0

ありがとう!私は、$ query-> getSingleResult()が$ query-> setMaxResults(1)とそれに続く$ query-> getResult()と同じ結果を生成すると推測しました。これはトリックでした。 :D – celestialorb

1

Doctrine2 常には、リポジトリクエリからプロキシオブジェクトを返します。これらはエンティティクラスを拡張し、すべての目的と目的のために同じものです。

プロキシは、単にエンティティが関連エンティティの遅延読み込みをサポートすることを可能にします(とりわけ)。問題は、すべてでは、プロキシオブジェクトではありません

は、あなたの編集を考えるhttp://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html?highlight=proxy#entity-object-graph-traversal