Kri*_*ode 1 php pagination gridview dataprovider yii2
当 GridView 中有 2 个模型并且在一行中插入了来自第二个模型的 1 个以上的记录时,我遇到了分页问题。
DataProvider 看起来像:
$query = Risks::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => array('pageSize' => 5),
]);
$query->joinWith(['solutions']);
Run Code Online (Sandbox Code Playgroud)
Ins第二个模型我有功能:
public function getSolutionValues (){
......
$content ='';
foreach ($order as $o){
$model = Solutions::findOne($o);
$content.= '<p>'.Html::encode($model->solution).'</p>';
}
return $content;
}
Run Code Online (Sandbox Code Playgroud)
在 GridView 我调用这个函数:
[
'attribute' => 'solutions',
'format' => 'raw',
'value' => function ($model) {
return $model->getSolutionValues();
},
],
Run Code Online (Sandbox Code Playgroud)
例如,这里只有前 3 条记录(而不是 5 条)可见,因为第一行插入了来自不同模型的 3 个条目。(如果插入一个解决方案,那么一切都可以)
如果我从列表中删除一个解决方案,分页不会改变,我必须从数据库中删除解决方案,然后只有分页不计入该条目。
它很晚才安静,但它可能会帮助面临同样问题的其他人。
这是意料之中的,当您尝试对涉及一对多关系的 JOIN 查询进行分页时会发生这种情况,因为由于一对多关系,JOIN 查询会为每个主记录返回许多行。解决方案是指定 select unique 并仅从主表中选择那些列。
在您的情况下,这应该有效:
$query = Risks::find()->distinct()->joinWith(['solutions']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => array('pageSize' => 5),
]);
Run Code Online (Sandbox Code Playgroud)