Sonata Admin Bundle:按计数一对多关系排序
Posted
技术标签:
【中文标题】Sonata Admin Bundle:按计数一对多关系排序【英文标题】:Sonata Admin Bundle: sort by count one to many relation 【发布时间】:2020-04-10 20:38:18 【问题描述】:如何在后台添加按票数排序?
我有一个与一对多投票相关的提名实体。 我需要允许按被提名者的票数排序。
我从这里尝试一个解决方案: https://github.com/sonata-project/SonataAdminBundle/issues/1077 首先在这里: Sonata Admin Bundle: show total count of collection on list view
但我收到错误消息: [语义错误] 第 0 行,第 184 列靠近“v_id_count ASC”:错误:未定义“v_id_count”。
这是来自 NomineeAdmin 的代码:
public function createQuery($context = 'list')
$query = parent::createQuery($context);
if ('list' === $context)
$parameters = $this->getFilterParameters();
if ('getVotesCount' === $parameters['_sort_by'])
$rootAlias = $query->getRootAliases()[0];
$query
->addSelect('COUNT(v.id) as v_id_count')
->leftJoin($rootAlias . '. votes', 'v')
->groupBy($rootAlias . '.id')
->orderBy('v_id_count', $parameters['_sort_order']);
return $query;
protected function configureListFields(ListMapper $listMapper)
$listMapper
//...
->add(
'getVotesCount',
null,
[
'sortable' => true,
'sort_field_mapping' => ['fieldName' => 'id'],
'sort_parent_association_mappings' => [],
]
);
【问题讨论】:
【参考方案1】:您是否尝试在实体中添加 getter 方法以返回关系数并将其用作 sort_field_mapping ?
getVotesNumber(): int ...
...
'sort_field_mapping' => ['fieldName' => 'votesNumber'],
我没有尝试过,但它应该可以工作(这样你就不必发出 sql 请求)
【讨论】:
这不起作用。在这种情况下,我收到一个错误:类型错误:传递给 Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::entityJoin() 的参数 1 必须是数组类型,给定 null,在 /var/www/symfony/vendor/sonata- 中调用project/doctrine-orm-admin-bundle/Datagrid/ProxyQuery.php 在第 143 行 这可能是因为 Symfony 尝试映射元素,你可以使用symfony.com/doc/current/reference/forms/types/form.html#mappedfalse。以上是关于Sonata Admin Bundle:按计数一对多关系排序的主要内容,如果未能解决你的问题,请参考以下文章
Sonata mongodb admin bundle filter by reference
Sonata Admin Bundle + Sonata User Bundle:覆盖登录表单
Sonata Media Bundle 与 Sonata Admin Bundle 3.0(或 2.4)
sonata-project/user-bundle dev-master 与 sonata-project/doctrine-orm-admin-bundle 冲突