yii2 GridView 查询子表数据(情景一)根据子表某字段排序或查询

本文介绍了使用Yii框架实现会员与订单模型之间的关联,并通过一对多关系查询会员及其订单数量。通过具体的代码示例展示了如何定义模型类、设置数据验证规则及属性标签,以及如何在搜索模型中实现订单数量的统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

backend\models\Member.php

<?php

namespace backend\models;

use Yii;

class Member extends \yii\db\ActiveRecord {

    public $orderCount;

    public static function tableName() {
        return '{{%member}}';
    }

    public function rules() {
        //省略
    }

    public function attributeLabels() {
        //省略
    }

    /**
     * 用户表和订单表是一对多的关系
     */
    public function getOrders() {
        return $this->hasMany(Order::className(), ['member_id' => 'id']);
    }

}

 

backend\models\MemberSearch.php

<?php

namespace backend\models;

use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;

class MemberSearch extends Member {

    public $orderCount;

    public function rules() {
        return [
            //其他的rule省略了
            [['orderCount'], 'integer'],
        ];
    }

    public function scenarios() {
        return Model::scenarios();
    }

    public function search($params) {
        $query = Member::find()->select([
            'member.*',
            '(select count(order.id) from order where order.member_id = member.id) as orderCount',
        ]);

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => ['defaultOrder' => ['id' => SORT_DESC]],
            'pagination' => [
                'pageSize' => 20
            ],
        ]);
        $dataProvider->sort->attributes['orderCount'] = [
            'asc' => ['orderCount' => SORT_ASC],
            'desc' => ['orderCount' => SORT_DESC],
        ];
        
        if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }

        $query->having(['orderCount' => $this->orderCount]); //根据用户的订单数进行筛选(一般是用户订单数的范围,我这里为了简单,写了个=)
        return $dataProvider;
    }

}

 

member\index.php

<?=
    GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            [
                'label' => '订单数量',
                'attribute' => 'orderCount',
            ],
        ],
    ]);
?>

 

希望可以帮到大家

转载于:https://my.oschina.net/ruiorz/blog/800172

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值