[英]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”之類的東西。
實際上,您可以做很多事情來實現這一目標,但是由於時間的消耗,某些方法可能不合適。 我更喜歡解決這個問題,因為
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.