2014-09-25 12 views
6

Mam dwie tabele bazy danych "użytkownik" i "rola". Użyłem Yii framework 2.0 Gii do stworzenia CRUD z modelem użytkownika i modelem UserSearch. Domyślnie Gii używa widgetu GridView :: widget dla strony indeksowej dla modelu "użytkownika".Yii Framework 2.0 GridView i dane z tabeli łączenia

W poszukiwaniu ($ params) metoda wewnątrz modelu UserSearch użyłem poniższy kod, żeby przyłączyć się do powyższych tabelach razem

$query = User::find()->with('role'); 

wszystko działa poprawnie z kwerendy.

Domyślnie Gii nie zawiera danych z połączonej tabeli "rola" w widgecie GridView :: wewnątrz strony views/user/index.php. Dzięki powyższemu zapytaniu mogę pobrać dane z obu tabel. Na stronie views/user/index.php wstrzyknąłem widget GridView :: z następującym kodem, aby zawierał on również dane i nazwy kolumn z połączonej tabeli (roli).

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     'userid', 
     'username', 
     'role.role_name', 
     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); ?> 

Wszystko działa poprawnie z danymi roli "nazwa_roli zawartej w widgecie GridView ::. Problem polega jednak na tym, że nie ma pola wyszukiwania dla nazwa_roli. Widget GridView :: tworzy pole wyszukiwania tylko dla właściwości użytkownika. Czy istnieje sposób dodania pola wyszukiwania dla właściwości połączonej tabeli "rola", ponieważ chciałbym również przeszukać "nazwa roli", a także poprzez inne właściwości modelu użytkownika.

+0

http: // www.yiiframework.com/doc-2.0/yii-grid-gridview.html#$columns-detail Tutaj yii2 zdefiniował nazwę kolumny wewnątrz tablicy z tablicą głównych kolumn. Nigdy wcześniej tego nie używałem. Mam nadzieję, że to pomoże – Kshitiz

+0

Czytałem tę dokumentację. Wiem, jak dodać niestandardowe kolumny do widgetu Gridview kratowania, na przykład niestandardowe kolumny połączonej tabeli. Problem polega jednak na tym, że nie ma pola wyszukiwania niestandardowych kolumn. Domyślne kolumny Gridview mają również pole wyszukiwania w nagłówku. –

+0

Czy próbowałeś wyświetlić tylko jedną kolumnę (nazwa roli)? – Kshitiz

Odpowiedz

1
  1. Wewnątrz CGridView dodaj poniższy kod. Umożliwi to filtr z dropDownList.

    [ 
         'attribute' => 'act_role_id', 
         'label' => 'Actor Role', 
         'value' => 'actRole.role_name', 
         'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name') 
        ], 
    

CGridView fragment kodu jest jak poniżej:

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

     'userid', 
     'username', 
     [ 
      'attribute' => 'act_role_id', 
      'label' => 'Actor Role', 
      'value' => 'actRole.role_name', 
      'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name') 
     ], 
     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); ?> 
+2

dzięki za odpowiedź, ale twój kod jest dla Yii 1 i używam Yii 2.0. Próbowałem przekonwertować próbkę kodu Yii 1 na kod Yii 2, ale bez powodzenia. Czy możesz pokazać mi, jak to zrobić w Yii 2.0? –

0

Spróbuj z

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

     //'role.role_name', 
     ['attribute' => 'role', 'value' => 'role.role_name'], 

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

Właśnie próbowałem w moim kodu, więc nie jestem pewien, czy działa to również z twoim kodem. Ale jeśli tak, nie wiem, dlaczego tak należy go zdefiniować.

Myślę, że odpowiedź Rajesh ujade obejmuje również tę definicję, jednak dla Yii 1.

3

Spróbuj w ten sposób:

W modelu UserSearch dodać

UserSearch extends ... 
{ 
    public $roleFilterInputName; //the name of the filter search input 

    //important 
    function rules() 
    { 
     //add roleFilterInputName as safe 
     return [ 
      [['xxx', 'roleFilterInputName'], 'safe'], //!!!! 
     ]; 
    } 
} 

w sieci:

'columns': 
[ 
    //... 
    [ 
    'attribute' => 'roleFilterInputName', 
    'value' => 'role.role_name' 
    ], 
    //... 
] 

w UserSearch :: wyszukiwanie()

$query->andFilterWhere(['like', 'role.role_name', $this->roleFilterInputName]) 

Ale myślę, że będziesz musiał użyć "joinWith" zamiast "with".

0

ten pracował dla mnie Tabela = ołów (id, year_id) Table = Year (id, tekst)

Dodany tekst w ołowiu (index.php) Rok :: find() -> All () = Ten kod pobiera całą wartość z tabeli/wszystkich lat.

  [ 
      'attribute'=> 'year_id', 
      'format' => 'html', 
      'value' => 'year.value', 
      'label' => 'Year', 
      'filter' => Html::activeDropDownList($searchModel, 'year', yii\helpers\ArrayHelper::map(Year::find()->all(), 'year_id', 'value'), ['class' => 'form-control', 'prompt' => '---']), 

     ], 

Pokazuje również rozwijanie i sortowanie.

image Showing Dropdown in Grdiview

0

@Ekonoval będzie w odpowiedni sposób.

Wystarczy dodać następujący funkcja serch z UserSearch:

Po zainicjowaniu obiektu ActiveDataProvider tak:

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

$dataProvider->sort->attributes['roleFilterInputName'] = [ 
    'asc' => ['role.role_name' => SORT_ASC], 
    'desc' => ['role.role_name' => SORT_DESC] 
]; 
0

Możesz napisać zapytanie w modelu UserSearch jak

if($this->role) 
{ 
    $query->join('LEFT JOIN','role','role.user_id = user.id')->andFilterWhere(['role.item_name' => $this->role]); 
}