2017-07-28 32 views
0

我的Symfony(3.3)表單EntityType顯示爲選擇輸入並列出了我們在數據庫中擁有的所有客戶端。客戶端實體與使用懶惰模式的其他幾個實體關聯。
當選擇框被渲染時,發出204個數據庫查詢。我懷疑表單組件根據每個查詢結果調用setter,導致加載許多額外的數據庫查詢。我們可以將關聯映射設置爲「EAGER」,或者在窗體的querybuilder選項中使用join('...') - > addSelect('...')方法強制數據成爲結果的一部分,但當涉及多個實體時,水合過程仍然昂貴。你可以看到,我試圖使用Doctrine Query HINT,希望它能解決問題,但它沒有改變任何東西。Symfony - 在EntityType查詢生成器的水合過程中丟棄關聯字段

那麼,這樣的用例有什麼辦法呢?
我應該怎麼做才能得到我需要填充下拉輸入的字段?

這裏是我試過到目前爲止:

$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」。
我希望Doctrine在使用默認的EntityType的QueryBuilder時自動加入並選擇這種關聯,但是它並沒有,我不得不明確告訴querybuilder這樣做(儘管fetch標誌設置爲'EAGER')。

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

我真的不明白了這裏發生了什麼底下怎麼回事,還是數據庫的請求數量降至下來回4個查詢。

相關問題