Php 基于函数调用值在Yii中使用CGridView对列进行排序

Php 基于函数调用值在Yii中使用CGridView对列进行排序,php,yii,cgridview,Php,Yii,Cgridview,我的视图文件中有以下代码: <?php $this->widget('zii.widgets.grid.CGridView', array( 'dataProvider'=>$dataProvider, 'columns'=>array( array( 'name' => 'Name', 'type'=>'raw', 'value' => 'C

我的视图文件中有以下代码:

    <?php $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name' => 'Name',
            'type'=>'raw',
            'value' => 'CHtml::link(CHtml::encode($data->profile->first_name." ".$data->profile->last_name),array("match/view","id"=>$data->id))',
        ),
        array(
            'name' => 'Similiarity Score',
            'type'=>'raw',
            'value' => array($this, 'calculateScore'),
        ),
    ),
)); ?>

我假设您的结果来自数据库,您使用的是
cactivedaptaprovider
CSqlDataProvider
。在这种情况下,您必须以某种方式将
calculateScore
的逻辑移到DB查询中。您可以将公共属性
score
添加到模型类中,并将其添加到
CDbCriteria的
select
属性中:

$criteria->select = array('*', '... SQL FOR SCORE CALC HERE ... AS score');
然后,您将能够在
cactivedaptaprovider的
sort
定义中按该
分数进行排序:

'sort' => array(
    'attributes' => array(
        // ...
        'score',

我假设您的结果来自一个数据库,您使用的是
cactivedaptrovider
CSqlDataProvider
。在这种情况下,您必须以某种方式将
calculateScore
的逻辑移到DB查询中。您可以将公共属性
score
添加到模型类中,并将其添加到
CDbCriteria的
select
属性中:

$criteria->select = array('*', '... SQL FOR SCORE CALC HERE ... AS score');
然后,您将能够在
cactivedaptaprovider的
sort
定义中按该
分数进行排序:

'sort' => array(
    'attributes' => array(
        // ...
        'score',

calculateScore的逻辑有点复杂,基本上每个数据行代表一个用户对象,我想计算它与当前用户的相似性指数。因此,它涉及很少的表连接,在数据库中的所有用户之间循环,并涉及一些复杂的预测算法。简而言之,它太复杂了,无法通过SQL查询实现(可能是可能的,但不希望如此)。有什么想法吗?那你就不走运了。排序是数据库的工作,因为您可能不想从DB加载所有行并在PHP端进行排序,除非您谈论的行总数非常少。当你需要分数进行排序时,你需要找到一种方法,如何将它的计算转移到数据库中。可能会将分数反规范化并将其作为一个单独的列存储到数据库中。calculateScore的逻辑有点复杂,基本上每个数据行代表一个用户对象,我想计算它与当前用户的相似性指数。因此,它涉及很少的表连接,在数据库中的所有用户之间循环,并涉及一些复杂的预测算法。简而言之,它太复杂了,无法通过SQL查询实现(可能是可能的,但不希望如此)。有什么想法吗?那你就不走运了。排序是数据库的工作,因为您可能不想从DB加载所有行并在PHP端进行排序,除非您谈论的行总数非常少。当你需要分数进行排序时,你需要找到一种方法,如何将它的计算转移到数据库中。可能会对分数进行反规范化,并将其作为一个单独的列存储到数据库中。