2017-03-01 83 views
0

我正在開發一個帶有Yii2框架的Web應用程序,而且我現在正面臨一個問題。我想在GridView中顯示來自多對多關係的數據,並能夠在稍後對這些字段進行過濾。Yii2從gridview中的多個關係中獲取數據並應用篩選器

我讀過的官方文檔here,一些計算器後like this和其他資源,但似乎無法得到它的工作。我有3個表:ACTIVIDADplan_actividadcirculo_icareACTIVIDAD有關plan_actividadcirculo_icare也涉及到它(plan_actividad是結表)。所以,我在我的ACTIVIDAD定義如下關係型號:

class Actividad extends \yii\db\ActiveRecord 
{ 
    .... 

public function getPlanActividad() 
{ 
    return $this->hasMany(PlanActividad::classname(), ['act_id' => 'act_id']); 
} 

public function getCirculo() 
{ 
    return $this->hasMany(CirculoIcare::classname(), ['cirica_id' => 'act_id'])->via('planActividad'); 
} 

... 
} 

的在我看來的index.php我試圖表現出這樣的GridView控件的值:

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

     // 'act_id', 
     ['attribute' => 'Codigo Evento', 'value' => 'act_numorden'], 
     ['attribute' => 'Nombre Evento', 'value' => 'act_nombre'], 
     ['attribute' => 'Fecha Evento', 'value' => 'act_fecha'], 
     ['attribute' => 'Locacion', 'value' => 'locacion.loc_nombre'], 
     [ 
     'attribute' => 'Circulo', 
     'value' => 'circulo.cirica_nombre', 

     ], 
     ['attribute' => 'Circulo id', 
     'value' => 'planActividad.cirica_id', 
     ], 
     // 'act_horaini', 
     // 'act_horafin', 
     // 'act_idencuesta', 
     // 'act_vigencia:boolean', 
     // 'loc_id', 

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

的問題是,我不能得到任何值與circulo關係表明,它總是顯示(未設置)。如果我改變的hasManygetPlanActividad()hasOne()話,就說明一些值(僅11 2應該的基礎上,cirica_idplan_actividad表存在),但這些都不是正確的無論如何。我知道我可以在搜索視圖中過濾那些字段,但我不明白爲什麼這些關係不能按我的預期工作。

任何幫助將不勝感激,讓我知道如果需要更多的信息,並提前感謝您。

回答

0

回答我自己的問題(學分來自yii官方論壇的softark)。

爲了使關係工作如預期,我不得不改變:

public function getCirculos() 
{ 
    return $this->hasMany(CirculoIcare::classname(), ['cirica_id' => 'act_id'])->via('planActividad'); 
} 

public function getCirculos() 
{ 
    return $this->hasMany(CirculoIcare::classname(), ['cirica_id' => 'cirica_id'])->via('planActividad'); 
} 

,並使用回調功能在GridView,以顯示正確的價值觀,因爲一個有許多關係給出了一個模型陣列和而不是單一模型。所以我修改了gridview代碼:

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

     ... 

     ['attribute' => 'circulo', 
     'value' => function($model){ 
      $items = []; 
      foreach($model->circulos as $circulo){ 
       $items[] = $circulo->cirica_nombre; 
      } 
      return implode(', ', $items); 
     }], 

     ... 

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

這給出了預期的結果。然後,您可以通過調整搜索模型輕鬆地應用關聯字段的過濾器。

相關問題