Yii:使用范围从相关模型获取不同的字段值

时间:2014-02-28 19:17:46

标签: php yii scopes

我正在使用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来说很新,但这似乎可以做到。

2 个答案:

答案 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)

实际上你可以做很多事情来实现,但是由于时间的消耗,某些方法是不合适的。

我更喜欢解决这个问题
  1. 在DB中创建一个名为user_project的表,其中包含属性
    ID
    user_id(fk到用户表)
    project_id(fk到项目表)
  2. 创建项目时,还会使用给定字段填充user_project。
  3. 制作模型,你会看到它的关系。现在做一个像
  4. 这样的功能
    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。此方法的好处是您不需要查询用户表的所有用户。