Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2从gridview中的多对多关系中获取数据并应用过滤器_Php_Html_Mysql_Gridview_Yii2 - Fatal编程技术网

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

Php Yii2从gridview中的多对多关系中获取数据并应用过滤器,php,html,mysql,gridview,yii2,Php,Html,Mysql,Gridview,Yii2,我正在用Yii2框架开发一个web应用程序,现在我面临一个问题。我希望在gridview中显示多对多关系中的数据,并能够在以后从这些字段中进行筛选 我已经阅读了官方文档、一些stackoverflow帖子和其他资源,但似乎无法使其发挥作用。我有三个表格:actividad,plan\u actividad和circulo\u icare,actividad与plan\u actividad相关,circulo\u icare也与之相关(plan\u actividad是连接表)。因此,我在我的A

我正在用Yii2框架开发一个web应用程序,现在我面临一个问题。我希望在gridview中显示多对多关系中的数据,并能够在以后从这些字段中进行筛选

我已经阅读了官方文档、一些stackoverflow帖子和其他资源,但似乎无法使其发挥作用。我有三个表格:actividadplan\u actividadcirculo\u icareactividadplan\u actividad相关,circulo\u icare也与之相关(plan\u 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,则它会显示一些值(根据plan\u actividad表中存在的cirica\u id,应该只有11个值中的2个),但这些值无论如何都不正确。我知道我以后可以在“搜索”视图中筛选这些字段,但我真的不明白为什么这些关系不能像我预期的那样工作

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

回答我自己的问题(yii官方论坛的softark

为了让关系如预期的那样工作,我不得不改变:

public function getCirculos()
{
     return $this->hasMany(CirculoIcare::classname(), ['cirica_id' => 'act_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'],
    ],
]); ?>


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

我想知道您是如何在搜索模型中筛选circulo属性的?
<?= 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'],
    ],
]); ?>