首页 > 解决方案 > 如何在视图中显示多个 GridView,其中一个 DataProvider 按某个字段对其进行分组?

问题描述

A 有一个表“操作”,其中包含所有用户的财务操作,包括“id”、“user_id”、“sum”、“name”、“date_picked”等。

我创建了一个 ActiveDataProvider 来获取具体用户的所有操作。现在我想在视图中显示来自这个数据提供者的数据——不是在一个 GridView 中,而是在几个 GridViews 中,这些数据按“date_picked”值分组。

我知道我可以为每个“date_picked”创建一个新的数据提供者,但是会有大量的数据库请求。

有没有办法根据一个数据提供者的数据在多个 GridView 中显示分组数据?

Controller:
/** @var OperationComponent $comp */
$comp = Yii::$app->operation;
$userId = Yii::$app->user->id;
$filterModel = $comp->getOperationSearch();
$operations = $comp->getSearchProvider($userId, Yii::$app->request->get());

OperationComponent:
public function getOperationSearch()
{
    return new OperationSearch();
}

public function getSearchProvider($user_id, $params)
{
    $model = new OperationSearch();
    return $model->search($user_id, $params);
}

OperationSearch:
public function search($user_id, $params)
{
$query = Operation::find();

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => [
        'pageSize' => 10,
    ],
  // сортировка по умолчанию
    'sort' => [
        'defaultOrder' => [
            'date_picked' => SORT_DESC
        ]
    ]
]);
return $dataProvider;

View:
....
<?= GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $filterModel,
.....
]); ?>
....

标签: yii2

解决方案


复杂的 GridView 有一个 Yii2 扩展:kartik-v/yii2-grid

它包含用于显示行详细信息的可折叠行。

您可以在此处查看演示。

您正在寻找的是Expand Row Column Widget。它允许通过仅加载此行详细信息所需的数据来扩展行。

这个扩展有一个很好的文档,非常稳定并且经过测试,可以直接使用。


推荐阅读