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

标签 php html mysql gridview yii2

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

我已阅读官方文档 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'],
    ],
]); ?>

问题是,我无法通过循环关系显示任何值,它总是显示(未设置)。如果我用 hasOne() 更改 getPlanActividad() 中的 hasMany ,那么它会显示一些值(只有 11 个值中的 2 个值,基于 < em>cirica_id 存在于 plan_actividad 表中),但这些无论如何都不正确。我知道我可以稍后在搜索 View 中过滤这些字段,但我不太明白为什么这些关系不能按我的预期工作。

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

最佳答案

回答我自己的问题(来自 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关系给出了模型数组,而不是单一模型。所以我将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'],
    ],
]); ?>

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

关于php - Yii2从gridview中的多对多关系获取数据并应用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539583/

相关文章:

php - 在 PHP 中从 SQL 格式化时间戳的最简单方法是什么?

php - 具有多个类别的 codeigniter 重复条目

php - 虚拟主机安全

php - PayPal:使用 API 处于实时模式时仪器被拒绝

php - 将纯文本输入转换为 HTML

xtype : 'formpanel' in Sencha Touch 2? 以上的 HTML

javascript - 输入字段仅针对第一个输入字段进行验证,无法删除输入字段

php - Mysql 获取 unicode 文本(印地语)以记录集/文件 php codeigniter

javascript - 将 JSON 发送到 PHP 文件并在 JS 中接收响应

php - 如何解决这个 PHP 通知错误?