Yii 1 - 按关系字段排序不起作用

时间:2017-01-19 16:34:59

标签: php yii

我知道这是一个常见的问题,但我收到了一个关于未加入表格的特定错误。

我的主要模特(组)有这种关系(1:1):

return array(
        'groupType'=>array(self::BELONGS_TO, 'GroupType', 'groupTypeId','order'=>'name ASC');

正如您所看到的,我已尝试将订单属性设置为无效。

正如你可以想象的那样,我的另一个模块GroupType有一个名为' name'的属性。

在网格视图中,只需使用关系名称

即可很好地打印关系模型
array(
    'name'=>'groupType',
    'value'=>'$data->groupType->name'
),

Autoload在GridView中运行良好。

不幸的是,该列不可排序。所以我将一个CSort参数放到搜索方法中提供的DataProvider中,如下所示:

$sort = new CSort();
    $sort->defaultOrder = 'id asc';
    $sort->attributes = array(
            'groupType'=>array(
                'asc'=>'groupType.name asc',
                'desc'=>'groupType.name desc'
            ),
            'description'=>array(
                    'asc'=>'t.description asc',
                    'desc'=>'t.description desc'
            ),
            'name'=>array(
                    'asc'=>'t.name asc',
                    'desc'=>'t.name desc'
            ),
            '*');

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>$sort
    ));

按说明和名称排序(组的属性)工作正常。当我尝试按groupType订购时,我得到的只是错误:

SQL: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'groupType.id' in 'order clause'. The SQL statement executed was: SELECT * FROM `cprol_groups` `t` ORDER BY groupType.idname asc LIMIT 20

如您所见,框架未加入我的相关表格。在这种情况下,由于相同的属性名称,我必须使用Alias?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

我已经决定强制加入。

在标准中,我必须强制加入:

$criteria->join = 'join '.GroupType::model()->tableName().' gt on gt.id = t.groupTypeId';

或使用 - > with语句:

$criteria->with = 'groupType';

删除关系中的默认顺序并添加别名:

return array('groupType'=>array(self::BELONGS_TO, 'GroupType', 'groupTypeId','alias'=>'gt'));

所以你可以按关系字段订购:

$sort = new CSort();
                $sort->defaultOrder = 'gt.name asc';
                $sort->attributes = array(
                                'groupTypeId'=>array(
                                        'asc'=>'gt.name asc',
                                        'desc'=>'gt.name desc'
                                ),