2016-04-25 5 views
1

古典的なテーブル:ユーザ、auth_item(ロール/許可の場合)、多対多ユーザのauth_assignment junction < - >ロール。yii2 GridViewの多対多の接合テーブルの表示

私は、ドキュメンテーションや他の人の質問に従っています(または、それに従おうとしました)。 「役割で

public function getRoles() { 
    return $this->hasMany(ArauthItem::className(), ['name' => 'item_name']) 
     ->viaTable('auth_assignment', ['user_id' => 'id']); 
} 

:「ユーザー」モデル(モデル/ Aruser.php)で

:私は、次の(私はActiveRecordのテストのための私のクラスのための「AR」接頭辞を持っている)を思い付い「auth_itemテーブルモデル(モデル/ ArauthItem.php)別名モデル:で

public function getUsers() { 
    return $this->hasMany(Aruser::className(), ['id' => 'user_id']) 
     ->viaTable('auth_assignment', ['item_name' => 'name']); 
} 

"ユーザ検索" モデル(モデル/ ArusersSearch.php):

class AruserSearch extends Aruser{ 
public $roles;  

public function rules() 
{ 
    return [ 
     [['id', 'status', 'created_at', 'updated_at'], 'integer'], 
     [['username', 'auth_key', 'password_hash', 'password_reset_token', 'email','roles'], 'safe'], 
    ]; 
} 

public function search($params) 
{ 
    $query = Aruser::find(); 
    $query->joinWith(['roles']); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 

    /* ... some skipped code, the usual ... */ 

    $query->andFilterWhere(['like', 'username', $this->username]) 
     ->andFilterWhere(['like', 'auth_key', $this->auth_key]) 
     ->andFilterWhere(['like', 'password_hash', $this->password_hash]) 
     ->andFilterWhere(['like', 'password_reset_token', $this->password_reset_token]) 
     ->andFilterWhere(['like', 'email', $this->email]) 
     ->andFilterWhere(['like', 'auth_item.name', $this->roles]); 

    return $dataProvider; 
} 

}

そして最後に、ビューファイルに:

GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 

     'id', 
     'username', 
     'auth_key', 
     'password_hash', 
     'password_reset_token', 
     'roles.name', 

     /* 
     [ 
     'attribute' => 'roles', 
     // this is an anonymous function built by me to retrieve correct concatanated related m to n values, but is it the proper and correct way? 
     'value' => function ($model) {  
        $multiple_res = ''; 
        foreach($model->roles as $role){ 
         $multiple_res .= ($multiple_res?',':'').$role->name; 
        } 
        return $multiple_res; 
       },    
     ], 
     */ 

     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); 

私は無名関数を使用しない限り、あなたは上記のコメントを参照することができ、「(未設定)」何を表示する役割列を作ることはできませんが。 Yii2> GridViewの多対多を1列に連結して表示する方法は何ですか?私は間違って何をしていますか?

ありがとうございます!

答えて

1

匿名関数を使用するのは正しい方法です。 Yiiは私が知っている限り話す機能をサポートしていません。

しかし、私はそうのようなあなたの機能簡素化します:

'value' => function($model) { 
    return implode(", ", array_map(function($ar){ 
      return $ar->name; 
    }, $model->roles)); 
} 
+0

、ほんの少しのコメントをあなたttdijkstraありがとう:破は、ここでは適用されません、$モデル - >役割が取ら配列 – dev299

+0

ポイントの配列です。どのように私の不注意。 – ttdijkstra

+0

ありがとう、ttdijkstra、それは助けになった。 – RezaGM