Symfony — отбросить поле ассоциации во время процесса гидратации построителя запросов EntityType

Моя форма Symfony (3.3) EntityType отображается как выбор ввода и перечисляет всех клиентов, которые у нас есть в базе данных. Клиентский объект связан с несколькими другими объектами, использующими отложенный режим.
При отображении поля выбора выдается 204 запроса к БД. Я подозреваю, что компонент формы вызывает сеттеры для каждого результата запроса, что приводит к загрузке многих дополнительных запросов к базе данных.

Я думаю, мы могли бы установить сопоставление ассоциации как «EAGER» или использовать методы join('…')->addSelect('…') внутри параметра querybuilder формы, чтобы заставить данные быть частью результатов, но процесс гидратации все еще дорого, когда задействовано несколько сущностей.
Как видите, я пытался использовать Doctrine Query HINT, надеясь, что это решит проблему, но это ничего не изменило.

Тогда как же поступить в таком случае?
Что мне нужно сделать, чтобы получить только те поля, которые мне нужны для заполнения раскрывающегося списка?

Вот что я пробовал до сих пор:

    $builder->add('parent', EntityType::class, [
        'class' => Client::class,
        ,'required' => false
        ,'multiple' => false
        ,'query_builder' => function (EntityRepository $er) {
            $qb = $er ->createQueryBuilder('c')
            // All I want doctrine to fetch are the following fields
                ->select('PARTIAL c.{id,uuid,name,shortName}');
            // I expected this flag to help but it does not change the total amount of queries executed
            $qb->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
            return $qb;
        }
    ])…

Спасибо.


person Stphane    schedule 28.07.2017    source источник


Ответы (1)


Решено

Одной из ассоциаций является oneToOne, и это единственная ассоциация, для которой ключ "fetch" сопоставления установлен на "EAGER".
Я ожидал, что Doctrine автоматически присоединится и выберет такую ​​ассоциацию при использовании QueryBuilder EntityType по умолчанию, но это не так, и мне пришлось явно указать построителю запросов сделать это (еще раз, несмотря на то, что для флага выборки установлено значение «EAGER»).

    return $qb->select('c, p')->leftJoin('c.param', 'p');

Я действительно не понимаю, что происходит внизу, но количество запросов к базе данных упало до 4 запросов.

person Stphane    schedule 31.07.2017