2014-12-04 76 views
1

我一直在使用[本] [1]解決方案ORDER BY多個列版本2.2.*它一直運行良好近一年。索納塔管理v2.3 - 多排排序=假排序

最近升級到版本2.3.*,並且該列表未再訂購結果。

我注意到,如果我設置至少一列爲sortable,事情將恢復正常。在我的情況下,我將所有列設置爲'sortable' => false,但我仍然希望按特定順序查看事件;我只是不希望用戶選擇排序順序!

有什麼辦法讓這個工作再次?

回答

2

這是由於下面的新增version;如果ProxyQuery::getSortOrder()不返回任何內容,則將刪除orderBy選項。

在這種情況下,該方法由Datagrid::buildPager() IF和ONLY自動調用如果列表配置至少有一列設置爲'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; 
} 
0

在索納塔管理2.3版這個簡單的解決方案可以使用或不使用可排序的列:

public function createQuery($context = 'list') 
{ 
    $proxyQuery = parent::createQuery($context); 

    $proxyQuery->orderBy('o.root', 'ASC'); 
    $proxyQuery->addOrderBy('o.lft', 'ASC'); 

    return $proxyQuery; 
}