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',
// .....
),
);