我有一个对象Object1
,它在一对多关系中引用Object2
:一个Object1
到多个Object2
。
在我的Object1
视图中,我尝试仅包含yii\grid\GridView
个相关的Object2
项。不是Object1
数据的补充。只需GridView
个Object2
件商品。
使用下面的代码,我相信我必须在我的控制器中同时设置$dataProvider
和$searchModel
,但我不确定如何将Yii::$app->request->queryParams
与{{1}相关联}}
我的代码只会返回所有$id
个项目,无论他们与Object2
的关系如何,虽然这对我来说很有意义,但并不是我想要的。
我甚至不确定这是正确的做法。有谁知道解决方案?提前谢谢。
Object1
答案 0 :(得分:1)
我可以建议替代方法,而不是在详细视图中渲染GridView。
为Object1
和Object2
项目创建单独的常规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来获得更好的视图组织。