Symfony:使用QueryBuilder构建连接两个表的选项



在Symfony中,我有一个带有某些作者书名的选项,例如:

->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"选择标签和标题实体中的此hack来做到这一点:

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

,但这在许多方面都很糟糕,特别是为了性能。因此,我尝试使用Concat在查询中构建"作者> title"字符串,但似乎无法使用查询构建器进行。

我已经检查了文档,所有示例都是一个单个实体,没有加入。

预先感谢:)

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

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

    ->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这样的标量结果,因为对象水合物用于获取实体。

最好的问候

相关内容

  • 没有找到相关文章

最新更新