繁体   English   中英

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

[英]Yii: Getting distinct field values from a related model using scopes

我正在使用Yii的Admin视图管理我的Project模型。

带有过滤器的列之一是项目的用户(所有者)。

我可以做这样的事情:

'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,
),

我已经尝试了上面的许多迭代,但是我已经失去了计数'with'=>'username''select'=>'username'等的能力,但是似乎无法正常工作。

我尝试用$ model替换Project :: model()只是因为我认为它可能与它有关,但是没有运气。

任何想法表示赞赏。 对Yii来说还很新,但这似乎可以解决。

一切准备就绪。 为项目模型定义一个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. 在具有属性的数据库中创建名为user_project的表
    ID
    user_id(复制到用户表)
    project_id(fk到项目表)
  2. 创建项目时,还请使用给定的字段填充user_project。
  3. 建立其模型,您将看到其中的关系。 现在做一个像
 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。 这种方法的好处是您不需要查询用户表的所有用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM