我正在使用Yii中的管理员视图作为我的项目模型。
其中一个带过滤器的列是项目的用户(所有者)。
我可以这样做:
'filter'=> CHtml::dropDownList('Project[user_id]', $model->user_id,
CHtml::listData(User::model()->orderAsc()->findAll(),
'id','username'),array('empty'=>'(select)')),
这给了我一个用户表中所有用户的列表,但是我想创建一些东西来吸引拥有项目的不同用户(我有200个用户,但只有少数用户倾向于创建项目)
项目和用户通过以下方式相关:
'user' => array(self::BELONGS_TO, 'User', 'user_id')
我在findAll()方法中尝试了一堆选项,但没有一个工作,我不是想用范围做一些事情。
到目前为止,我已经尝试过这个:
'filter'=> CHtml::dropDownList('Project[user_id]', $model->user_id,
CHtml::listData(Project::model()->with('user')->ownerUsernames()->
findAll(), 'id','username'),array('empty'=>'(select)')),
我的范围定义为:
'ownerUsernames' => array(
'with' => 'user.username',
'select' => 'user.username',
'distinct' => true,
),
我已经尝试了上面的这么多次迭代我已经丢失计数'用'=>'用户名''选择'=>'用户名'等,但似乎无法让它工作
我尝试用$ model替换Project :: model()因为我认为它可能与它有关,但没有运气。
任何想法都表示赞赏。对Yii来说很新,但这似乎可以做到。
答案 0 :(得分:1)
你准备好了一切。为项目模型定义一个像
这样的getter函数public function getUsername()
{
return $this->user->name;
}
现在你应该可以使用
了CHtml::dropDownList('Project[user_id]', $model->user_id,
CHtml::listData(Project::model()->with('user')->ownerUsernames()->
findAll(), 'id','username'),array('empty'=>'(select)'))
逻辑是CHtml :: listData将项目作为模型,它将使用$ project-> id创建密钥,它将使用$ project-> username创建值。因为您创建了getted函数,所以它将知道$ project-> username是什么。不幸的是CHtml :: listData(Project :: model() - > with('user') - > ownerUsernames() - > findAll(),'id','user.name')将不起作用,因为它不能执行'user.name'或类似的东西。
答案 1 :(得分:0)
实际上你可以做很多事情来实现,但是由于时间的消耗,某些方法是不合适的。
我更喜欢解决这个问题public function getName() { return user->name;//here i have assumed that the relation name is user }
$user=UserProject::mode::findAll(); $list=CHtml::listData($user,'user_id','name');
并使用此列表填充dropDownList。此方法的好处是您不需要查询用户表的所有用户。