【问题标题】:Yii2 get data from many to many relation in gridview and apply filterYii2在gridview中从多对多关系中获取数据并应用过滤器
【发布时间】:2017-03-01 18:46:43
【问题描述】:

我正在使用 Yii2 框架开发一个 Web 应用程序,我现在面临一个问题。我想在网格视图中显示来自多对多关系的数据,并能够稍后从这些字段中进行过滤。

我已阅读官方文档 here、一些 stackoverflow 帖子 like this 和其他资源,但似乎无法使其正常工作。我有 3 个表:actividadplan_actividadcirculo_icareactividadplan_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 关系显示任何值,它总是显示 (未设置)。如果我将 getPlanActividad() 中的 hasMany 更改为 hasOne() 则它​​会显示一些值(根据em>cirica_id 存在于 plan_actividad 表),但无论如何这些都不正确。我知道我可以稍后在搜索视图中过滤这些字段,但我真的不明白为什么这些关系不能按我预期的那样工作。

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

【问题讨论】:

    标签: php html mysql gridview yii2


    【解决方案1】:

    回答我自己的问题(感谢来自 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 中使用 callback 函数来显示正确的值,因为 hasMany 关系提供了一个模型数组,而 not单一模型。于是我将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'],
        ],
    ]); ?>
    

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

    【讨论】:

    • 我想知道您是如何设法过滤搜索模型中的 circulo 属性的?
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多