2016-10-20 28 views
1

我试图提供一个选择具有> 300个选择单一的EntityType产生一个大组查询

$form->add('products', EntityType::class, array(
    'class' => Product::class, 
    'query_builder' => function (ProductRepository $er) use ($customerId) { 
     return $er->QBByCustomer($customerId); 
    }, 
    'choice_label' => 'l.name', 
)); 

的的QueryBuilder的:

public function QBByCustomer($customer = null) 
{ 
    return $this->QB() 
     ->addSelect('p.name AS HIDDEN name') 
     ->join('p.customer', 'c') 
     ->join('p.label', 'l') 
     ->where('c.customer = :customer') 
     ->setParameter('customer', $customer) 
     ->addOrderBy('name') 
    ; 
} 

当我呈现的形式,教义产生> 300查询加载每个相关对象。

有没有办法告诉学说使用我给的QueryBuilder中的标签,而不是发射尽可能多的查询作为可选项目?

+0

可以显示这个查询的一个?他们在找什么? – Matteo

+1

显示产品实体的代码和映射。 – Gerry

+1

我建议如下:在实体关系上使用fetch =“extra_lazy”,使用','multiple'=> true,'expanded'=> true' –

回答

2

由于显示的标签是从链接的实体(label)中提取的,我们必须帮助Doctrine加载它。

这里是QueryBuilder的应该什么样子:

'query_builder' => function (ProductRepository $er) use ($customerId) { 
    $qb = $er->QBByCustomer($customerId); 
    $qb->addSelect('partial p.{id}'); 
    $qb->addSelect('partial l.{id, name}'); 
    return $qb; 
}, 
'choice_label' => 'label.name',