Yii2:用于一对多关系数据的GridView

时间:2016-07-31 17:39:45

标签: php yii2

我有一个对象Object1,它在一对多关系中引用Object2:一个Object1到多个Object2

在我的Object1视图中,我尝试仅包含yii\grid\GridView个相关的Object2项。不是Object1数据的补充。只需GridViewObject2件商品。

使用下面的代码,我相信我必须在我的控制器中同时设置$dataProvider$searchModel,但我不确定如何将Yii::$app->request->queryParams与{{1}相关联}}

我的代码只会返回所有$id个项目,无论他们与Object2的关系如何,虽然这对我来说很有意义,但并不是我想要的。

我甚至不确定这是正确的做法。有谁知道解决方案?提前谢谢。

Object1

1 个答案:

答案 0 :(得分:1)

我可以建议替代方法,而不是在详细视图中渲染GridView。

Object1Object2项目创建单独的常规ActionColumn小部件。

扩展Object1 GridView的[ 'class' => 'yii\grid\ActionColumn', 'template' => '{objects2} {view} {update} {delete}', 'buttons' => [ 'objects2' => function ($url, $model, $key) { /* @var $model common\models\Object1 */ return Html::a( '<span class="glyphicon glyphicon-arrow-down"></span>', ['objects2/index', 'object1_id' => $model->id], [ 'title' => 'Objects 2', 'aria-label' => 'Objects 2', 'data-pjax' => '0', ] ); }, ], ], 以及相关项目的附加链接。我已经解释过它goes on,但为了更好地理解,我还在此处加入了代码:

index

修改Object2Controller的{​​{1}}操作以接受其他参数(对象1 ID):

/**
 * @param integer $object1_id
 * @return string
 * @throws \yii\web\NotFoundHttpException
 */
public function actionIndex($object1_id)
{
    $searchModel = new Object2Search;
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}
search()的{​​{1}}方法也应该处理其他参数:

Object2Search

请务必不要在/** * @param array $params * @return ActiveDataProvider */ public function search($params) { $query = Object2::find()->where(['object1_id' => $params['object1_id']]); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); if (!($this->load($params) && $this->validate())) { return $dataProvider; } // Additional filters return $dataProvider; } 中添加object1_id和其他过滤器。

至于rules()项目的显示,只需排除Object2列,即可完成。

显然,这可以更多地定制,这只是一个基本的例子。

这种方法的主要优点是不同类型的模型的代码是分开的,更容易维护。

至于在详细视图中使用它,请修改object1_id模型的search()方法,以便按上述Object2Search应用初始过滤器,但在这种情况下,传递object1_id来自查询参数的参数(来自id动作):

view

使用$query = Object2::find()->where(['object1_id' => $params['id']]); 的partials来获得更好的视图组织。