2017-07-28 8 views
0

My Symfony(3.3)フォームEntityTypeは選択入力として表示され、データベースにあるすべてのクライアントをリストします。クライアントエンティティは、レイジーモードを使用するいくつかの他のエンティティに関連付けられています。
選択ボックスをレンダリングすると、204個のDBクエリが発行されます。私はフォームコンポーネントがそれぞれのクエリ結果に対してセッターを呼び出すため、多くの追加のデータベースクエリをロードすることになります。Symfony - EntityType querybuilderのハイドレーションプロセス中の関連フィールドを破棄します

データを強制的に結果の一部にするために、フォームのquerybuilderオプション内のjoin( '...') - > addSelect( '...')メソッドを使用して、 "EAGER"いくつかの事業体が関与している場合、水分補給プロセスは依然としてコストがかかる。
私はDoctrine Query HINTを使って問題を解決したいと考えましたが、何も変わっていませんでした。

次に、このようなユースケースにはどのような方法がありますか?
ドロップダウン入力に入力する必要があるフィールドのみを取得するにはどうすればよいですか?ここで

は、私がこれまで試したものです:

$builder->add('parent', EntityType::class, [ 
     'class' => Client::class, 
     ,'required' => false 
     ,'multiple' => false 
     ,'query_builder' => function (EntityRepository $er) { 
      $qb = $er ->createQueryBuilder('c') 
      // All I want doctrine to fetch are the following fields 
       ->select('PARTIAL c.{id,uuid,name,shortName}'); 
      // I expected this flag to help but it does not change the total amount of queries executed 
      $qb->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true); 
      return $qb; 
     } 
    ])… 

ありがとうございました。

を解決

答えて

0

アソシエーションの一つはoneToOneであり、そのマッピングが「EAGER」にキーセットを「フェッチ」が唯一のものです。
デフォルトのEntityTypeのQueryBuilderを使用するときに、Doctrineが自動的にこのような関連付けを選択して選択することを期待しましたが、そうしないため、querybuilderに明示的に指示する必要がありました(フェッチフラグを 'EAGER'に設定しても)。

return $qb->select('c, p')->leftJoin('c.param', 'p'); 

私は本当にここの下で何が起こっているかのポイントを得ることはありません、データベースのリクエストはまだ数が戻って4つのクエリに落下しました。

関連する問題