我正在开发具有YII2框架的Web应用程序,我现在正在面临问题。我想在GridView中显示从多到许多关系的数据,并在以后从这些字段过滤。
我已经阅读了官方文档在此处,一些stackoverflow post 喜欢和其他资源,但似乎无法使其工作。我有3个表: actividad , plan_actividad 和 Circulo_icare , actividad 与>和 Circulo_icare 也与之相关( Plan_actividad 是接口表)。因此,我在 actividad 模型中定义了以下关系:
class Actividad extends yiidbActiveRecord
{
....
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' => 'yiigridSerialColumn'],
// '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' => 'yiigridActionColumn'],
],
]); ?>
问题是,我无法通过 Circulo 关系显示任何值,它总是显示(未设置)。如果我更改 hasmany 在 getPlanactividad()中使用 hasone() ,则显示一些值(只有11个中的2个应该基于<< cirica_id 在 plan_actividad 表上存在),但无论如何这些都不正确。我知道我可以在以后的搜索视图中过滤这些字段,但我并不真正理解为什么这种关系无法正常工作。
任何帮助将不胜感激,让我知道是否需要更多信息,并提前感谢您。
回答我自己的问题(从YII官方论坛中归功于 softark )。
为了按预期工作,我必须更改:
public function getCirculos()
{
return $this->hasMany(CirculoIcare::classname(), ['cirica_id' => 'act_id'])->via('planActividad');
}
to
public function getCirculos()
{
return $this->hasMany(CirculoIcare::classname(), ['cirica_id' => 'cirica_id'])->via('planActividad');
}
并在GridView中使用回调函数显示正确的值,因为A Hasmany 关系提供了一系列模型和不是 a单型。因此,我将GridView代码修改为:
<?= GridView::widget([
'dataProvider' => $dataProvider,
// 'filterModel' => $searchModel,
'columns' => [
['class' => 'yiigridSerialColumn'],
...
['attribute' => 'circulo',
'value' => function($model){
$items = [];
foreach($model->circulos as $circulo){
$items[] = $circulo->cirica_nombre;
}
return implode(', ', $items);
}],
...
['class' => 'yiigridActionColumn'],
],
]); ?>
这给出了预期的结果。然后,您可以通过调整搜索模型轻松地通过关系字段应用过滤器。