【问题标题】:Pagination in GridView counts all records when there are multiple models, but rows count expected in Yii2当有多个模型时,GridView 中的分页计算所有记录,但 Yii2 中预期的行数
【发布时间】:2015-05-03 21:34:36
【问题描述】:

当 GridView 中有 2 个模型并且在一行中从第二个模型插入超过 1 条记录时,我遇到了分页问题。

DataProvider 看起来像:

    $query = Risks::find();

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

    $query->joinWith(['solutions']);

在第二个模型中我有功能:

  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 个条目。 (如果插入一个解决方案,那么一切都可以)

如果我从列表中删除一个解决方案,分页不会改变,我必须从数据库中删除解决方案,然后只有分页不计入该条目。

【问题讨论】:

  • 分页不依赖于行内显示的内容。您的查询很可能有问题。展示它是如何形成的。我还建议为此目的使用关系yiiframework.com/doc-2.0/…
  • 实际上所有查询都是$query = Risks::find(); $query-&gt;joinWith(['solutions']); 只有在搜索模型中的$this-&gt;load($params); 之后还有更多,但据我了解 - 这仅用于搜索。你的意思是分页关系?
  • 如果使用关系是为了得到一个解决方案列表,那么我有特殊的顺序,我不能从上到下全部查询
  • 如果没有$query-&gt;joinWith(['solutions']);,是否返回正确的分页?
  • 是的,那么它是正确的,但是由于未定义的表而无法过滤或排序:(

标签: php gridview pagination yii2 dataprovider


【解决方案1】:

它很晚了,但它可能会帮助其他面临同样问题的人。

这是意料之中的,当您尝试对涉及一对多关系的 JOIN 查询进行分页时会发生这种情况,因为由于一对多关系,JOIN 查询会为每个主记录返回许多行。解决方案是指定 select unique 并仅从主表中选择那些列。

在您的情况下,这应该可以:

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

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

【讨论】:

  • distinct() 与众不同。谢谢!这应该是公认的答案。
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多