【问题标题】:Symfony 2: Sonata sortableSymfony 2:可排序的奏鸣曲
【发布时间】:2026-01-26 00:05:02
【问题描述】:

我的实体中有:

/**
 * @ORM\ManyToMany(targetEntity="Sancho\UserBundle\Entity\followers", mappedBy="followers")
 */
private $followers;

在奏鸣曲中,我想获得 $followers[] 的数量。我在我的实体中创建:

public function getFollow()
{
      return count($this->followers);
}

在 UserAdmin 我有:

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->add('id')
            ->add('follow', null, array('sortable'=>true));
}

我有 $follow[] 的数量,但我无法对该字段进行排序。当我排序时出现错误:

PHP Catchable fatal error:  Argument 1 passed to Sonata\\DoctrineORMAdminBundle\\Datagrid\\ProxyQuery::entityJoin() must be of the type array, null given, called in /home/sancho/work/Web/vendor/sonata-project/doctrine-orm-admin-bundle/Datagrid/ProxyQuery.php on line 140 and defined in /home/sancho/work/Web/vendor/sonata-project/doctrine-orm-admin-bundle/Datagrid/ProxyQuery.php on line 245

【问题讨论】:

标签: php symfony sonata-admin symfony-sonata


【解决方案1】:

你看错了方向......奏鸣曲中的 Sortable 用于定义一个包含位置编号的字段,因此您确实可以对事物进行排序,但基于它为自己编写的索引,因此它需要数据库中的一个字段,这就是您收到该错误的原因。您需要做的是使用排序功能覆盖管理类中的 createQuery 方法。看看here 怎么做。

【讨论】:

  • 你有一个 OneToMany 链接的例子吗?我有 2 个实体(用户和关注)。目前我使用 getFollow() {return count($this->followers;}。如何使用 queryBuilder 按“关注”的数量对我的字段进行排序?
  • 他建议做一个小组。但这不起作用。仍在寻找解决方案
  • 我被这个问题弄疯了,有没有人找到解决方案?
【解决方案2】:

我不确定这是否适用于您的情况。但我认为问题可能在于您如何访问该字段。

->add('follow', null, array('sortable'=>true));

你应该使用

->add('followers.follow');

我在“商店”和“产品”之间建立了关系,我使用了ManyToOnerelations,并且从关系表中我得到了->addIdentifier('store'),它显然使用了 __toString 方法,因此无法排序。但是,当我关联->addIdentifier('store.name') 时,它是可以排序的name 字段。

【讨论】: