我要走出大山 2023-11-09 16:57 采纳率: 59.1%
浏览 1
已结题

yii2 order模型下2张表如何分页展示列表

yii2,有一个Order模型,由于测试数据量增加,需要拆分数据存放2张订单表,分别是:order_1、order_2,每个表有100万条数据,问题是:如何在后台对2个表同时搜索查询,并分页展示在列表页;每页展示10条数据。正常一张表情况下的查询代码如下,请修改下面代码适合2张表查询:

public function actionIndex()
    {

        $searchModel = new SearchModel([
            'model' => Order::class,
            'scenario' => 'default',
            'partialMatchAttributes' => ['mobile'], // 模糊查询
            'defaultOrder' => [
                'id' => SORT_DESC
            ],
            'pageSize' => $this->pageSize
        ]);

        $query = $searchModel->search(Yii::$app->request->queryParams);
        $query->query
            ->andWhere(['>=', 'status', 1])
            ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
            ->with(['tags', 'merchant']);

        return $this->render($this->action->id, [
            'dataProvider' => $query,
            'searchModel' => $searchModel,
        ]);

前端代码为:

……(省略)
<?= GridView::widget([
                    'dataProvider' => $dataProvider,
                    'filterModel' => $searchModel,
                    'headerRowOptions' => [
                        'class' => 'table-header-wrap'
                    ],
                    'columns' => [
                        [
                            'class' => 'yii\grid\SerialColumn',
                            'visible' => true, // 不显示#
                        ],
                        [
                            'attribute' => 'order_id',
                            'filter' => false, //不显示搜索框
                            'headerOptions' => ['class' => 'col-md-1'],
                        ],
……(省略)
  • 写回答

7条回答 默认 最新

  • bug菌¹ 优质创作者: Java、算法与数据结构技术领域 2023-11-09 18:50
    关注

    该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳。


    要在yii2的Order模型下的两张订单表(order_1和order_2)中进行搜索查询并分页展示,您可以按照以下步骤进行:

    1. 创建新的SearchModel:在创建SearchModel实例时,您需要传入两个模型类(Order_1和Order_2)和相应的查询配置。
    $searchModel = new SearchModel([
        'models' => [
            Order_1::class,
            Order_2::class
        ],
        'scenario' => 'default',
        'partialMatchAttributes' => ['mobile'], // 模糊查询
        'defaultOrder' => [
            'id' => SORT_DESC
        ],
        'pageSize' => $this->pageSize
    ]);
    
    1. 合并查询结果:在查询时,您可以使用Yii2的Union查询来合并两个表的查询结果。
    $query = $searchModel->search(Yii::$app->request->queryParams);
    $query->joinWith(['tags', 'merchant'])
        ->andWhere(['>=', 'status', 1])
        ->andFilterWhere(['merchant_id' => $this->getMerchantId()]);
    
    $dataProvider = new ActiveDataProvider([
        'query' => $query->union(),
        'pagination' => [
            'pageSize' => 10
        ]
    ]);
    
    1. 修改前端代码:在GridView部分,您可以将dataProvider改为新创建的dataProvider,以展示合并后的查询结果。
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'headerRowOptions' => [
            'class' => 'table-header-wrap'
        ],
        'columns' => [
            [
                'class' => 'yii\grid\SerialColumn',
                'visible' => true, // 不显示#
            ],
            [
                'attribute' => 'order_id',
                'filter' => false, //不显示搜索框
                'headerOptions' => ['class' => 'col-md-1'],
            ],
            // 其他列
        ],
    ]) ?>
    

    通过这个修改,您就可以在后台同时搜索查询两张表的订单数据,并按照每页10条数据进行分页展示。请确保在此代码中替换相应的模型和关联关系。

    希望以上内容对您有所帮助!如果您有任何疑问,请随时提问。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月10日
  • 创建了问题 11月9日