Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii 带有关系表的CGridView排序按relaton Id参数排序_Yii_Cgridview_Yii Events - Fatal编程技术网

Yii 带有关系表的CGridView排序按relaton Id参数排序

Yii 带有关系表的CGridView排序按relaton Id参数排序,yii,cgridview,yii-events,Yii,Cgridview,Yii Events,在``页面中使用关系模型对关系数据进行排序时,我在CGrid中遇到了问题 简要介绍我的情景: 我有一个用户模型:实体=>id,用户名 和一个配置文件模型:实体=>id、firstname、lastname、user\u id、等 我想在CGrid中列出profile model和username中的user model,以便排序和搜索更好。在我的例子中,排序username是通过user\u id完成的,而不是通过username完成的。我想通过用户名搜索它,因此我执行以下操作: 我的控制器操作

在``页面中使用关系模型对关系数据进行排序时,我在
CGrid
中遇到了问题

简要介绍我的情景: 我有一个用户
模型:实体=>id,用户名
和一个配置文件
模型:实体=>id、firstname、lastname、user\u id、

我想在
CGrid
中列出
profile mode
l和
username
中的
user model
,以便排序和搜索更好。在我的例子中,排序
username
是通过
user\u id
完成的,而不是通过
username
完成的。我想通过
用户名
搜索它,因此我执行以下操作:

我的控制器操作: 我的模型关系: 示范规则: 和模型搜索功能 我的 在排序过程中,排序工作正常,但排序是基于
用户id
而不是
用户名进行的。我错过的任何东西都可以这样做。请建议

参考文献:(我也尝试了通过声明一个公共变量作为链接中的建议,但是bot正在工作。)

编辑:问题修复后。
谢谢你的链接。

好吧,你找到的维基页面真的是一个很好的开始

以下是另一种方法:

在您的个人资料模型中:

// private username attribute, will be used on search
private $_username;

public function rules()
{
    return array(
        // .....
        array('username', 'safe', 'on'=>'search'),
        // .....
    );
}

public function getUsername()
{
    // return private attribute on search
    if ($this->scenario=='search')
        return $this->_username;

    // else return username
    if (isset($this->user_id)) && is_object($this->user))
        return $this->user->username;
}

public function setUsername($value)
{
    // set private attribute for search
    $this->_username = $value;
}

public function search()
{
    // .....
    $criteria->with = 'user'; 
    $criteria->compare('user.username', $this->username, true);
    // .....

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>array(
            'attributes'=>array(
                'username'=>array('asc'=>'user.username', 'desc'=>'user.username DESC'),
                '*',
            ),
        ),
    ));
}
在您看来,您只需尝试一下:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'profile-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        // .....
        'username',
        // .....
    ),
);

很抱歉回复晚了。。当我尝试时,我得到以下结果:错误500:CDbExceptionCDbCommand未能执行SQL语句:SQLSTATE[42S22]:Column not found:1054未知列'user.username'(在'order子句'中)

我认为此行引发了错误..'用户名'=>array('asc'=>'user.username','desc'=>'user.username desc'),请确保使用参数设置条件
$criteria->with='user'是的,我做到了。正如你在我的问题中看到的一样。在你的问题中的
if
陈述中?你让我明白了。。!终于修好了。
array( 'xxx,yyy,user_name', 'safe', 'on'=>'search' ),
if(!empty($this->user_id)){
$criteria->with='user'; 
$criteria->order = ::app()->request->getParam('sort');// 'username ASC'
} 

$criteria -> compare('user.username', $this->user_id, true);
$this->widget('zii.widgets.grid.CGrid', array(
'id'=>'profile-grid',
'dataProvider'=>$model->search(),
 'filter'=>$model,
array('name'=>'user_id',
    'header'=>User::model()->getAttributeLabel('username'), 
    'value' =>'$data->getRelated(\'user\')->username',
    'type'=>'raw',
    'htmlOptions'=>array('style'=>'text-align: center'),),
   ---------------
// private username attribute, will be used on search
private $_username;

public function rules()
{
    return array(
        // .....
        array('username', 'safe', 'on'=>'search'),
        // .....
    );
}

public function getUsername()
{
    // return private attribute on search
    if ($this->scenario=='search')
        return $this->_username;

    // else return username
    if (isset($this->user_id)) && is_object($this->user))
        return $this->user->username;
}

public function setUsername($value)
{
    // set private attribute for search
    $this->_username = $value;
}

public function search()
{
    // .....
    $criteria->with = 'user'; 
    $criteria->compare('user.username', $this->username, true);
    // .....

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>array(
            'attributes'=>array(
                'username'=>array('asc'=>'user.username', 'desc'=>'user.username DESC'),
                '*',
            ),
        ),
    ));
}
$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'profile-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        // .....
        'username',
        // .....
    ),
);