2015-11-10 28 views
2

實體輸入性能我有一個實體輸入字段是加載部署形式(選擇 - 選項)120000結果。渲染這使得頁面最多需要30秒加載。改善與許多成果的Symfony2

你知不知道任何其他方式來處理這種類型的控制形式的symfony用不了這麼長時間來加載?

形式:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
    ->add('name', 'text') 
    ->add('contact', 'text', array(
      'required' => false 
    )) 
    ->add('address', 'text') 
    ->add('id_spanish_town', 'entity', array(
      'class' => 'PanelBundle:SpanishTowns', 
      'query_builder' => function(EntityRepository $er){ 
       return $er->createQueryBuilder('z') 
       ->orderBy('z.name', 'asc'); 
      } 
    )) 
    ->add('password', 'repeated', array(
      'type' => 'password', 
      'first_name' => 'pass', 
      'second_name' => 'pass_confirm', 
      'mapped' => false, 
      'required' => false 
    )) 
    ->add('email', 'email', array(
      'required' => false 
    )) 
    ->add('about_us', 'textarea', array(
      'required' => false 
    )) 
    ->add('save', 'submit', array(
      'label' => 'Save' 
    )); 
} 

問候和感謝。

+1

你可以嘗試緩存,同時還獲取了實體沒有保溼他們,直接查詢只爲需要的字段(ID,而對於選擇的描述) – Jean

+1

無全世界有一個人正在等待從120.000個選擇中做出選擇。相反,你可以使用jquery的自動完成功能。 –

回答

3

而不是提供選擇的所有產品中,我會使用一些項目建議和AJAX/JSON提供有限制〜15個項目。

我們有大約60萬件產品,它會崩潰數據庫這樣一個巨大的選擇。

的簡化版本QueryBuilder

// ... 

/** 
* @var int 
*/ 
const ITEMS_LIMIT = 15; 


public function getDataForResponse($entityName, $name) 
{ 
    $queryBuilder = $this->entityManager->createQueryBuilder() 
     ->select('e.id, e.name') 
     ->from($entityName, 'e'); 
     ->where('e.name LIKE :name') 
     ->setParameter('name', '%' . $name . '%'); 

    return $queryBuilder->getQuery() 
     ->setMaxResults(self::ITEMS_LIMIT) 
     ->getResult(Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY); 
} 
+2

也許看看客戶端的selectize.js – mblaettermann