Yii2从gridview中的多对多关系中获取数据并应用过滤器

时间:2017-03-01 18:46:44

标签: php html mysql gridview yii2

我正在使用Yii2框架开发一个Web应用程序,我现在正面临一个问题。我希望在gridview中显示多对多关系中的数据,并且稍后可以从这些字段中进行过滤。

我已阅读官方文档 here ,某些stackoverflow帖子 like this 和其他资源但似乎无法获取工作。我有3个表: actividad plan_actividad circulo_icare actividad plan_actividad 和 circulo_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 关系显示任何值,它始终显示(未设置)。如果我使用 hasOne()更改 getPlanActividad()中的 hasMany ,那么它会显示一些值(仅11个中的2个,基于< em> cirica_id 存在于 plan_actividad 表中)但这些都不正确。我知道我可以稍后在搜索视图中过滤这些字段,但我真的不明白为什么关系不像我预期的那样工作。

非常感谢任何帮助,如果需要更多信息,请告诉我,并提前感谢您。

1 个答案:

答案 0 :(得分: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中使用回调功能来显示正确的值,因为 hasMany 关系提供了一系列模型而 a单一模型。所以我将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'],
    ],
]); ?>

这给出了预期的结果。然后,您可以通过调整搜索模型轻松地通过关系字段应用过滤器。