2015-08-23 24 views
6

Używam widżetu gridview do wyświetlania danych.Jak połączyć dwie tabele i uzyskać wartości w gridowym widoku Yii2

Używam dwóch tabel o nazwach: wiadomość i message_trigger.

W kolumnach tabeli znajduje się object_model, Object_id.

W message_trigger kolumny są object_id, object_name.

Siatka pobiera wartości z tabeli wiadomość. Tak więc pola siatki to Object_model, Object_id.

Teraz mój problem jest muszę pokazać Object_name od stołu message_trigger oparciu o object_id z komunikatu stół .

W moim formularzu Użyłem siatki jak ten

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     'object_model', 
     'object_id', 
     ['class' => 'yii\grid\ActionColumn', 'template' => '{view} {update} {delete} '], 
    ], 
]); ?> 

W modelu użyłem

public function search($params){ 
    $query = AlertTrigger::find()->where(['alert_id'=>$params['id']])->andWhere(['!=','status',2]); 
    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 
} 

Odpowiedz

8

W Message Modelu

public function getMessageTrigger() 
{ 
    return $this->hasOne(MessageTrigger::className(), ['object_id' => 'object_id']); 
} 

w widoku

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     'object_model', 
     'object_id', 
     [ 
      'label' => 'Name', 
      'value' => 'messageTrigger.object_name', 
     ], 
     ['class' => 'yii\grid\ActionColumn', 'template' => '{view} {update} {delete} '], 
    ], 
]); ?> 
+0

Co się stanie, jeśli będę musiał również dokonać ** sort_name **? – Choxx

3

ankitraturi answer to najlepsza odpowiedź. Jeśli ktoś chce uzyskać wartość za pomocą funkcji z modelu i użyć go w widoku siatki, wykonaj poniższe kroki.

  1. Dodaj funkcję, która zwraca wartość w modelu (tutaj używam modelu Message).
public static function get_message_trigger($id){ 
    $model = MessageTrigger::find()->where(["object_id" => $id])->one(); 
    if(!empty($model)){ 
     return $model->object_name; 
    } 

    return null; 
} 
  1. W Gridview użyciu jak poniżej.
<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     'object_model', 
     'object_id', 
     [ 
      'label' => 'Name', 
      'value' => function($data){ 
       return Message::get_message_trigger($data->object_id) 
      }, 
     ], 
     ['class' => 'yii\grid\ActionColumn', 'template' => '{view} {update} {delete} '], 
    ], 
]); ?> 

nadzieję, że pomoże ktoś.

+0

dobry. pomogło mi – Pratik

+0

Dziękuję, zadziałało ... – Ivan