Php Yii框架-CGridView排序相关列

Php Yii框架-CGridView排序相关列,php,gridview,frameworks,jquery-ui-sortable,yii,Php,Gridview,Frameworks,Jquery Ui Sortable,Yii,提前感谢任何能提供帮助的人。我一直在寻找答案,但还没有找到。我遇到过从一行到重写整个类都不起作用的“解决方案” 我有“网格”来显示关系,并且能够使用搜索功能。我搞不懂的是排序功能。一旦进行了以下更改,列标题将不可单击 这就是我所拥有的: 关系名称/标签为“公司”,在员工模型中设置 表:雇员--列:idCompany & 表:Company--列:companyNick admin.php-查看 <?php $this->widget('zii.widgets.grid.CGridVi

提前感谢任何能提供帮助的人。我一直在寻找答案,但还没有找到。我遇到过从一行到重写整个类都不起作用的“解决方案”

我有“网格”来显示关系,并且能够使用搜索功能。我搞不懂的是排序功能。一旦进行了以下更改,列标题将不可单击

这就是我所拥有的:

关系名称/标签为“公司”,在员工模型中设置

表:雇员--列:idCompany & 表:Company--列:companyNick

admin.php-查看

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'employee-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
            array(
                    'name'=>'company',   
                    'value'=>'$data->company->companyNick',
            ),
            'lastName',
            'firstName',

ETC...

这似乎是一个关于[yii]的日常问题。从搜索函数中删除这些内容,并向CGridView列添加一个过滤器属性,如下所示:

        array(
                'name'=>'company',   
                'value'=>'$data->company->companyNick',
                'filter' => CHtml::listData(Company::model()->findAll(),'id','nick'),
        ),

我也遇到过同样的问题,最后用这种方式解决了:

模型搜索方法:

$sort = new CSort();
$sort->attributes = array(
'assignedTo'=>array(
    'asc'=>'(SELECT surname from people 
            WHERE people.person_id = t.assigned_to) ASC',       
    'desc'=>'(SELECT surname from people 
            WHERE people.person_id = t.assigned_to) DESC',     
    ),
    '*', // add all of the other columns as sortable   
); 
查看文件:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'tasks-grid',
'dataProvider'=>$model->search(),
//'filter'=>$model,
'columns'=>array(
    'task',
    array(
    'header'=>'Assigned To',
    'value'=> '$data->assignedTo->surname.", ".$data->assignedTo->forename',
        'name'=> 'assignedTo',
        'sortable'=>TRUE,
        ),
    'due_date',
    'status',       
),
)))


通过这种方式,我从相关表中选择一个字段到order by子句中,然后按该字段排序,您可以在表达式中创建表联接,在本例中,它是-
people.person\u id=t.assigned\u to
(其中t是yii提供的表别名)。这也许不是创建ORDERBY子句的最有效的方法,但它确实有效

在Yii网站的Wiki页面上也有很好的解释:
我喜欢迈克H的答案。我还想指出,您可以使用with()执行关系查询,然后将select设置为false,以防止实际加载相关模型,而不是输入原始SQL。还可以通过传递点符号字符串在视图中使用相关属性的attributeLabel,例如:


// Controller
$gridDataProvider = new CActiveDataProvider('EmrFormPatientTie', array(
    'criteria'=>array(
        'condition'=>'flag_locked=0',
        'with'=>array('patient'=>array(
            'select'=>false, // Perform relational query without loading related models
        )),
    ),
    'pagination'=>(array('pageSize'=>15)),
    'sort'=>array(
        'attributes'=>array(
            'patient.display_id'=>array(
                'asc'=>'patient.display_id',
                'desc'=>'patient.display_id DESC',
            ),
            '*', // Make all other columns sortable, too
        ),
    ),
));

// View
array(
    'name'=>'patient.display_id',
    'value'=>'$data->patient->display_id',
),


我不想创建下拉菜单。我想使用表格标题进行排序(而不是选择);和其他人一样,你仍然可以。但是,如果您想按公司名称而不是外键进行排序,则必须将其插入到数据提供程序(例如$model->search())中。我使用CSort开始了正确的路径。。。你不是很具体。谢谢你告诉我,我需要改变“某些东西”来让它工作。很明显。哇,我相信你会从“我是一个无法容忍的,对每个试图帮助我的人都不领情的混蛋”这句话中得到很多好处。谢谢。下次试着读这个问题,而不是用一个与之无关的不伦不类的答案来回答。

// Controller
$gridDataProvider = new CActiveDataProvider('EmrFormPatientTie', array(
    'criteria'=>array(
        'condition'=>'flag_locked=0',
        'with'=>array('patient'=>array(
            'select'=>false, // Perform relational query without loading related models
        )),
    ),
    'pagination'=>(array('pageSize'=>15)),
    'sort'=>array(
        'attributes'=>array(
            'patient.display_id'=>array(
                'asc'=>'patient.display_id',
                'desc'=>'patient.display_id DESC',
            ),
            '*', // Make all other columns sortable, too
        ),
    ),
));

// View
array(
    'name'=>'patient.display_id',
    'value'=>'$data->patient->display_id',
),