我正在使用 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'],
],
]); ?>
问题是,我无法通过循环关系显示任何值,它总是显示(未设置)。如果我用 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/