我對於無關聯的反對意見有同樣的問題。您最好的選擇是使用select2的ajax加載(http://ivaynberg.github.com/select2/),這會在搜索框中顯示有限數量的項目,並且還會根據框中鍵入的內容縮小搜索範圍。
有幾件事情事情需要編碼:
JavaScript文件:
$(document).ready(function(){
$('.select2thing').select2({
minimumInputLength:1
,width: "100%"
,ajax: {
url: <<path>> + "entity/json"
,dataType: 'jsonp'
,quitMillis: 100
,data: function (term, page) {
return {
q: term, // search term
limit: 20,
page: page
};
}
,results: function (data, page) {
var more = (page * 20) < data.total;
return { results: data.objects, more: more };
}
}
});
}
一個jsonAction控制器:
/**
* Lists all Thing entities return in json format
*
*/
public function jsonAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$rep = $em->getRepository('yourBundle:Thing');
$qb = $rep->createQueryBuilder('e');
$limit = $request->query->get('limit');
$current = $request->query->get('current');
$page=$request->query->get('page');
$queries=$request->query->get('q');
$qarray=explode(",", $queries);
$entities=$rep->getJSON($qarray, $page, $limit);
$total=$rep->getJSONCount($qarray);
$callback=$request->query->get('callback');
return $this->render('yourBundle:Thing:json.html.twig'
, array(
'entities' => $entities
,'callback' => $callback
,'total' => $total
)
);
}
樹枝模板(json.html.twig ,可能定製顯示更多)
{{callback}}(
{ "objects" :
[
{% for entity in entities %}
{ "id": "{{entity.id}}", "text": "{{entity}}""}
{% if not loop.last %},{% endif %}
{% endfor %}
],
"total": {{total}}
}
)
變壓器:
使用選擇2控制必須將 '時間' 傳遞給表單生成器控制器:
$editForm = $this->createForm(new ThingType()
,$entity
,array(
'attr' => array(
'securitycontext' => $sc
,'em' => $this->getDoctrine()
->getEntityManager()
)
)
);
而在你的表單類型:
if (isset($options['attr']['em'])){ $em = $options['attr']['em'];} else {$em=null;}
$transformer = new ThingTransformer($em);
$builder->add(
$builder->create('thing'
,'hidden'
,array(
'by_reference' => false
,'required' => false
,'attr' => array(
'class' => 'select2thing'
)
)
)
->prependNormTransformer($transformer)
);
當然,您可以只從一個實體加載所有數據,假定與其他實體的數據沒有依賴關係。 – undefined
默認情況下,Doctrine具有延遲加載功能。它只應在你需要時加載這些實體。也許你已經意外地禁用了它? – Raziel
我如何檢查是否啓用延遲加載?我如何啓用它? 我認爲這是禁用的,因爲當我做某個實體的var_dump()時,它會嘗試顯示所有遞歸實體並崩潰我的瀏覽器。謝謝! – aaubets