У меня проблемы с разбиением на страницы, когда в GridView есть 2 модели и в один ряд вставлено более 1 записи из второй модели.
DataProvider выглядит так:
$query = Risks::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => array('pageSize' => 5),
]);
$query->joinWith(['solutions']);
Ins вторая модель у меня есть функция:
public function getSolutionValues (){
......
$content ='';
foreach ($order as $o){
$model = Solutions::findOne($o);
$content.= '<p>'.Html::encode($model->solution).'</p>';
}
return $content;
}
И в GridView я вызываю эту функцию:
[
'attribute' => 'solutions',
'format' => 'raw',
'value' => function ($model) {
return $model->getSolutionValues();
},
],
Например, здесь видны только первые 3 записи (вместо 5), поскольку в первую строку вставляются 3 записи из разных моделей. (Если вставлено одно решение, то все в порядке)
И если я удаляю одно решение из списка, нумерация страниц не изменяется, я должен удалить решение из БД, и тогда только нумерация страниц не учитывает эту запись.
Это тихо поздно, но это может помочь кому-то еще сталкиваться с той же проблемой.
Это ожидаемо, и это происходит, когда вы пытаетесь разбить на страницы запрос JOIN, включающий отношение один-много, потому что запрос JOIN возвращает много строк для каждой первичной записи из-за отношения один-много. Решение состоит в том, чтобы указать select unique и выбрать только те столбцы из первичной таблицы.
В вашем случае это должно работать:
$query = Risks::find()->distinct()->joinWith(['solutions']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => array('pageSize' => 5),
]);
Других решений пока нет …