如何在Yii的CGridView中展示关联表名称而非ID?
解决CGridView中显示sender/receiver用户名而非ID的问题
我来帮你搞定这个需求!要把msg表里sender和receiver的ID换成对应的用户名,思路和你已经实现的用户名称列差不多,只需要两步就能完成:
第一步:在Msg模型里建立关联关系
首先得确保你的Msg模型和用户表(假设模型是User,表名是users)建立了正确的关联。打开Msg.php,找到relations()方法,添加两个关联:
public function relations() { return array( // 关联发送者用户模型 'senderUser' => array(self::BELONGS_TO, 'User', 'sender'), // 关联接收者用户模型 'receiverUser' => array(self::BELONGS_TO, 'User', 'receiver'), ); }
这里的senderUser和receiverUser是自定义的关联名称,你可以根据习惯修改,只要对应好msg表的sender和receiver外键就行。
第二步:修改CGridView的列配置
接下来更新你的CGridView代码,把sender和receiver列替换成显示对应的用户名:
<?php $this->widget('zii.widgets.grid.CGridView', array( "dataProvider" => $dataProvider, "columns" => array( array( "header" => 'Sender Name', "value" => 'CHtml::encode($data->senderUser->user_id)', // 通过关联模型获取发送者用户名 ), array( "header" => 'Receiver Name', "value" => 'CHtml::encode($data->receiverUser->user_id)', // 通过关联模型获取接收者用户名 ), 'subject', 'message', ) )); ?>
几个实用小提示:
- 如果你的用户表存储用户名的字段不是
user_id(比如是username),记得把代码里的user_id改成对应的字段名。 - 一定要保留
CHtml::encode(),这能防止XSS攻击,保障页面安全。 - 要是担心存在用户被删除的情况(导致关联模型为空),可以加个容错判断:
'$data->senderUser ? CHtml::encode($data->senderUser->user_id) : "Unknown"',这样就不会出现报错啦。
内容的提问来源于stack exchange,提问作者Mallesh
相关产品推荐
相关产品推荐

