我一直在版本ORDER BY
的多个列上使用[this] [1]解决方案2.2.*
它已经运行了近一年。
最近升级到版本2.3.*
,列表不再对结果进行排序。
我注意到,如果我将至少一列设置为sortable
,则事情会恢复正常。在我的情况下,我将所有列设置为'sortable' => false
,但我仍然希望按特定顺序查看事物;我只是不希望用户选择排序顺序!
有什么方法可以让它再次运作?
答案 0 :(得分:2)
这是由于新version中增加了以下内容;如果orderBy
没有返回任何内容,则会移除ProxyQuery::getSortOrder()
个选项。
在这种情况下,Datagrid::buildPager()
IF会自动调用该方法,并且只有列表配置至少有一列设置为'sortable' => true
,请参阅DataGrid.php#L126。如果所有列都不可排序,则会删除自定义ORDER BY
选项!
在多列上ORDER BY
的唯一方法是确保在某个时刻调用方法ProxyQuery::setSortOrder
,请参阅ProxyQuery.php#140。
我不确定这是否是一种意想不到的副作用,或者它是如何设计的。
要解决此问题,请将至少一列设置为'sortable' => true
(或根本不设置排序)或修改管理类中的createQuery
方法,如下所示:
public function createQuery($context = 'list')
{
$proxyQuery = parent::createQuery($context);
// Default Alias is "o"
$proxyQuery->orderBy('o.name', 'ASC');
// This can only be used for a single column.
$proxyQuery->setSortBy([], ['fieldName' => 'date']);
$proxyQuery->setSortOrder('DESC');
return $proxyQuery;
}
答案 1 :(得分:0)
在Sonata admin版本2.3中,这个简单的解决方案可以使用或不使用可排序列:
public function createQuery($context = 'list')
{
$proxyQuery = parent::createQuery($context);
$proxyQuery->orderBy('o.root', 'ASC');
$proxyQuery->addOrderBy('o.lft', 'ASC');
return $proxyQuery;
}