Разбивка на страницы в GridView подсчитывает все записи при наличии нескольких моделей, но в Yii2 ожидается количество строк

У меня проблемы с разбиением на страницы, когда в 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 записи из разных моделей. (Если вставлено одно решение, то все в порядке)
введите описание изображения здесь

И если я удаляю одно решение из списка, нумерация страниц не изменяется, я должен удалить решение из БД, и тогда только нумерация страниц не учитывает эту запись.

1

Решение

Это тихо поздно, но это может помочь кому-то еще сталкиваться с той же проблемой.

Это ожидаемо, и это происходит, когда вы пытаетесь разбить на страницы запрос JOIN, включающий отношение один-много, потому что запрос JOIN возвращает много строк для каждой первичной записи из-за отношения один-много. Решение состоит в том, чтобы указать select unique и выбрать только те столбцы из первичной таблицы.

В вашем случае это должно работать:

$query = Risks::find()->distinct()->joinWith(['solutions']);

$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => array('pageSize' => 5),
]);
4

Другие решения

Других решений пока нет …