2016-06-23 2 views
1

В Symfony У меня есть форма с Выберите вариант с названия книги некоторых авторов, таких, как это:Symfony: Используйте QueryBuilder для создания выбора параметров объединения двух таблиц

->add('title', EntityType::class, [ 
      'class' => 'AppBundle:Title', 
      'choice_label' => 'fullTitle', 
      'query_builder' => function (EntityRepository $er) { 
       $queryBuilder = $er->createQueryBuilder('title'); 
       $queryBuilder 
        ->select('title') 
        ->innerJoin('title.author', 'author') 
        ->addOrderBy('author.name', 'ASC') 
        ->addOrderBy('title.title', 'ASC'); 

       return $queryBuilder; 
      }, 
      'label' => 'fields.title.title' 
     ]) 

Я хочу, чтобы отобразить имя автора и название названия таким образом: «Автор> Заголовок». Мне удалось сделать это с помощью «FullTitle» ярлык выбора и с этим хака в сущности Название:

public function getFullTitle() 
{ 
    return $this->getAuthor()->getSurname() . ', ' . $this->getAuthor()->getName() . ' > ' . $this->getTitle(); 
} 

Но это очень плохо во многих отношениях, особенно для повышения производительности. Итак, я попытался построить строку «Автор> Заголовок» в запросе с помощью CONCAT, но, похоже, это невозможно сделать с построителем запросов.

Я проверил документацию, и все примеры относятся к одному объекту, без объединений.

Заранее спасибо :)

ответ

2

Вы должны выбрать как title, а также author, в противном случае author все равно будут загружены с помощью отложенной загрузки. Достаточно добавить ->addSelect('author').

0

Если вы хотите, чтобы оптимизировать загрузку данных, вы можете использовать частичный запрос с необходимыми информациями в вашем построителе запросов и использовать замыкание для создания метки без изменения сущности

->add('title', EntityType::class, [ 
     'class' => 'AppBundle:Title', 
     'choice_label' => function ($entity) { 
      return $entity->getAuthor()->getSurname() . ', ' . 
        $entity->getAuthor()->getName() . ' > ' . 
        $entity->getTitle(); 
     }, 
     'query_builder' => function (EntityRepository $er) { 
      $queryBuilder = $er->createQueryBuilder('title'); 
      $queryBuilder 
       ->select('partial title.{id, title}') 
       ->addSelect('partial author.{id, surname, name}') 
       ->innerJoin('title.author', 'author') 
       ->addOrderBy('author.name', 'ASC') 
       ->addOrderBy('title.title', 'ASC'); 

      return $queryBuilder; 
     }, 
     'label' => 'fields.title.title' 
    ]) 

Я не думаю, что EntityType может управляйте скалярным результатом, например CONCAT, потому что объект hydrator используется для получения объектов.

С уважением

Смежные вопросы