在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"字符串,但似乎无法使用查询构建器进行。
我已经检查了文档,所有示例都是一个单个实体,没有加入。
预先感谢:)
您必须同时选择title
和author
,否则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
这样的标量结果,因为对象水合物用于获取实体。
最好的问候