2017-03-16 72 views
1

我有正常的ModelSearch與ActiveDataProvider,我想添加一個虛擬/相關的屬性來排序gridview。如果我正在使用setSort,並且添加了這個唯一屬性,那麼所有其他屬性都不能再排序。有沒有一種內置的方式來添加一個屬性來排序?非常感謝!Yii2添加相關的屬性進行排序

public function search($params) { 
    $query = Za::find(); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
     'sort' => ['defaultOrder' => ['aonr' => SORT_ASC]], 
     'pagination' => [ 
      'pageSize' => 15, 
     ], 
    ]); 

$dataProvider->setSort([ 
    'attributes' => [ 
     'lwnr' => [ 
      'asc' => ['lwnr' => SORT_ASC], 
      'desc' => ['lwnr' => SORT_DESC], 
      'label' => 'lwnr', 
      'default' => SORT_DESC, 
     ], 
    ] 
]); 

$this->load($params); 
... 
} 
+0

更新你的問題並添加RELAT ed ModelSearch code .. – scaisEdge

+0

[This will help](http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/) –

+0

當然,但正如我所說,如果我使用setSort,那麼所有其他屬性停止排序,我將不得不再定義所有其他屬性。問題是,如果有一個內置的解決方案**添加**一個新的屬性來排序旁邊的現有的。 – user2511599

回答

1

您可以設置與setSort方法可排序的屬性,但在這種情況下,你需要設置要排序的所有列,不只是從關係的列。

如果你想添加一列,你可以試試這個(合併與新的當前存在的某種屬性):

$dataProvider->setSort([ 
     'attributes' => array_merge(
      $dataProvider->getSort()->attributes, 
      [ 
       'lwnr' => [ 
        'asc'  => ['lwnr' => SORT_ASC], 
        'desc' => ['lwnr' => SORT_DESC], 
        'label' => 'lwnr', 
        'default' => SORT_DESC, 
       ], 
      ] 
     ), 
    ]); 

,或者你可以手動添加缺少的屬性/列(這是一個遠更好的主意)

$dataProvider->setSort([ 
     'attributes' => 
      [ 
       'lwnr' => [ 
        'asc'  => ['lwnr' => SORT_ASC], 
        'desc' => ['lwnr' => SORT_DESC], 
        'label' => 'lwnr', 
        'default' => SORT_DESC, 
       ], 
       // Other attribute 
       'id' => [ 
        'asc' => ['id' => SORT_ASC], 
        'desc' => ['id' => SORT_DESC], 
       ], 
       ... 
      ], 
    ]); 

另一種方式:

$dataProvider->getSort()->attributes['lwnr'] = [ 
        'asc'  => ['lwnr' => SORT_ASC], 
        'desc' => ['lwnr' => SORT_DESC], 
        'label' => 'lwnr', 
        'default' => SORT_DESC, 
       ]; 
+0

非常感謝你,這正是我所需要的上一個)。 – user2511599

+0

爲什麼較低的想法更好? – user2511599

+0

當你注意到屬性字段有默認數據(你的數據庫表中的列)。 因此,第一個示例:每次呈現頁面時,會生成,訪問默認排序屬性並與您的新值合併,並重新分配結果。這是不必要的,因爲您的數據庫表中沒有動態列,您可以手動定義這些值。 Ps .: 嘗試剛剛更新答案的第三個例子 –

相關問題