Один тип объекта, генерирующий большой набор запросов

#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',