#symfony #doctrine-orm
#symfony #доктрина-orm
Вопрос:
Я пытаюсь предоставить выбор из > 300 вариантов
$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')
;
}
Когда я визуализирую форму, Doctrine генерирует > 300 запросов для загрузки каждого связанного объекта.
Есть ли способ указать Doctrine использовать метки из предоставленного мной QueryBuilder, вместо того, чтобы запускать столько запросов, сколько выбираемых элементов?
Комментарии:
1. можете ли вы показать один из этих запросов? Что они ищут?
2. Покажите код и отображение объекта Product.
3. я предлагаю следующее: использовать выборку=»extra_lazy» для отношения объектов , использование ‘,’multiple’ => true, ‘expanded’ => true’
4. Хорошо, я обнаружил, что использую метку связанного объекта. Я собираюсь попробовать использовать здесь частичную загрузку
Ответ №1:
Поскольку отображаемая метка извлекается из связанной сущности ( 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',