【问题标题】:Symfony: Use querybuilder to build select options joining two tablesSymfony:使用 querybuilder 构建连接两个表的选择选项
【发布时间】:2016-06-24 00:06:39
【问题描述】:

在 Symfony 中,我有一个带有 Select 选项的表单,其中包含一些作者的书名,例如:

->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”选择标签并在 Title 实体中使用这个 hack 来做到这一点:

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

但这在很多方面都很糟糕,特别是在性能方面。 因此,我尝试使用 CONCAT 在查询中构建“作者 > 标题”字符串,但似乎无法使用查询生成器完成。

我查看了文档,所有示例都是关于一个没有连接的实体。

提前致谢:)

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    您必须同时选择titleauthor,否则author 仍将通过延迟加载加载。添加->addSelect('author') 就足够了。

    【讨论】:

      【解决方案2】:

      如果您想优化数据加载,您可以在查询构建器中使用带有所需信息的部分请求,并使用闭包来构建标签而不修改实体

          ->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 那样管理标量结果,因为对象水合器用于获取实体。

      最好的问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 2023-03-10
        相关资源
        最近更新 更多