1


我正在尝试使用 Yii 列表视图实现排序。我在列表视图中加入了 2 个名为 provider_favourite 和 service_request 的表。两个表中的字段和内容都列在列表视图中。但是排序只在 provider_favourite 表中起作用,而不是在 service_request 表中。如何对 service_request 表中的字段进行排序?我正在使用 csort 进行排序。我也试过 CGrid 视图。但同样的问题也发生在网格视图中..
我使用以下代码加入

 $criteria = new CDbCriteria;
    $criteria->select = 'favourite_notes,favourite, favourite_added_date,max_budget,preferred_location,service_name';
    $criteria->join = 'LEFT JOIN service_request AS s ON  service_request_id = favourite';
    $criteria->condition = 'favourite_type = 1';
    $sort=new CSort('ProviderFavourite');
 //        $sort->defaultOrder='s.max_budget ';
    $sort->applyOrder($criteria);
    $sort->attributes = array(
            'max_budget' => 'service_request.max_budget',
            'service_name' => 'service_request.service_name',
            'favourite_added_date'
    );
        $type = 2;
    $data = new CActiveDataProvider('ProviderFavourite', array('criteria' => $criteria, 'pagination' => array('pageSize' => 4),'sort'=>$sort
            ));
    $this->renderPartial('favourites', array(
        'ModelInstance' => ProviderFavourite::model()->findAll($criteria),
        'dataProvider' => $data, 'type' => $type, 'sort'=>$sort,
    ));

并且还在列表视图中提供可排序的属性

 $this->widget('zii.widgets.CListView', array('dataProvider'=>$dataProvider,'itemView'=>'index_1',     
         'id'=>'request',
         'template' => '  {items}{pager}',
         'sortableAttributes'=>array('favourite_notes','max_budget','service_name')
 )); 

如果需要更多细节,我会提供。提前致谢

4

2 回答 2

2

您必须指定实例的attributes属性。$sort默认情况下,只有$modelClassProviderFavourite在您的情况下)的字段是可排序的。

我认为它可能看起来像这样(未经测试):

$sort->attributes = array(
    'service_name' => array(
        'asc' => 's.service_name ASC',
        'desc' => 's.service_name DESC'
    ),
    // ...another sortable virtual attributes from service_request table
    "*"
);
于 2013-04-17T11:22:27.017 回答
1

您不应该CSort$sort. 将CActiveDataProvider已经为您提供正确的排序对象。执行此操作的方式是$criteria在配置排序属性之前应用排序条件。那是行不通的。

您应该尝试这样的简单设置:

$data = new CActiveDataProvider('ProviderFavourite', array(
    'criteria' => $criteria, 
    'pagination' => array('pageSize' => 4),
    'sort'=> array(
        'attributes' => array(
            'service_name' => array(
                'asc' => 's.service_name ASC',
                'desc' => 's.service_name DESC'
           ),
           // ...
    ),
));

如果您需要访问相关CSort对象(如果您使用CGridViewor ,通常不会这样做CListView,因为它们会为您处理),那么您可以通过$data->sort.

于 2013-04-17T13:10:28.710 回答