2015-03-03 7 views
1

У меня проблемы с разбиением на страницы, когда в GridView есть 2 модели, и в одной строке добавлено более 1 записи из второй модели.Pagination in GridView подсчитывает все записи при наличии нескольких моделей, но количество строк ожидается в Yii2

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 записи из разных моделей. (Если один раствор вставлен, то everithing является Ok) enter image description here

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

+0

Разбивка не зависит от отображаемого контента внутри строк. Скорее всего, что-то не так с вашим запросом. Покажите, как он сформировался. Также я рекомендую использовать отношения для таких целей http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#working-with-relational-data. – arogachev

+0

На самом деле весь запрос - '$ query = Риски :: find(); $ query-> joinWith (['solutions']); 'Только после' $ this-> load ($ params); 'в поисковой модели больше, но, как я понимаю, это только для поиска. И вы имеете в виду отношения для разбивки на страницы? –

+0

Если с использованием отношений было предназначено для получения списка решений, то у меня есть специальный порядок, я не могу запросить все сверху вниз –

ответ

1

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

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

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

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

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

' distinct() 'делает разницу. Спасибо! Это должен быть принятый ответ. – bds