yii多表查询--学习随笔

本文介绍在Yii框架中如何通过修改model和modelSearch类,实现多表联合查询及搜索功能,包括添加get方法、调整search方法和视图文件,以实现更高效的数据检索和展示。

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

今天自己做一个小demo,为了不要冗余字段,需要进行多表联合查询、搜索

yii中,用model来映射数据库(其实好多框架都是这么搞的),一个模型类通常有一个search模型类跟着一起

废话不多说了,首先,数据库里有布置一张表,我习惯让数据表之间相互独立,建表的时候没有添加外键约束,而是采用 u_id、a_id 等字段来表示关联关系;

下图是我设计表格中常常包括的字段

上面的表为一个join报名表,u_id是报名用户的id,j_id是报名项目的id,a_id是该项目负责人的id,分别关联了三张表

通过Gii生成的默认首页表单不包括其他三张表的内容,这里不赘述,要实现如下效果:

需要对如下几个文件进行修改:

  1. 本页对应model、修改是增加相应的get方法
  2. 对应的modelSearch、修改是把关联加进去,用于搜索
  3. 首页视图的修改,替换原来的U ID、J ID、A ID等

一、修改model,增加get方法

yii中,get方法实际上可以理解成往model对象中增加新的属性、方法,也就是添加与其他表的映射关系

  /**
     * 根据u_id获取用户信息
     */
    public function getUser()
    {
        return $this->hasOne(User::className(), ['id' => 'u_id']);
    }

二、修改modelSearch,加入关联查询

...其他代码...

//增加成员属性(增加的查询字段)
    public $real_name;
//在ruler规则中添加
[['real_name'], 'safe'],
//在search方法中 
...
//增加查询表 也就是要和哪张表一起查
$query->joinWith(['user']);

...
$query->andFilterWhere(['like', 'user.real_name', $this->real_name]); 
...

//设置搜索同时给新增的选项添加排序规则
//注意是重写,所以要加上原来有的项目


$dataProvider->setSort(['attributes' => [
      
'id',
      'expectation',
      'work_time',
      'status',
      'real_name' => [
        'asc' => ['user.real_name' => SORT_ASC],
        'desc' => ['user.real_name' => SORT_DESC],
        'label' => 'user.real_name' ],
      ]
     ]
    ]);

return $dataProvider;

setSort是为在首页表上显示的字段提供排序的规则,它自己的有,新加入的需要添加一下,会覆盖原有的,所以模型本来的字段不能漏,否则无法按该字段排序

三、修改view

看代码,这个是视图文件中的index.php文件,也就是修改GridView

<?= GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'columns' => [
                'id',
                //'u_id',
                [
                    'attribute' => 'real_name',
                    'value' => 'user.real_name',
                    'label' => '用户'
                ],
                'expectation',
                'work_time',
                'status',
                 ['class' => 'yii\grid\ActionColumn'],
            ],
        ]); ?>

这样就可以搜索了,也可以排序的哦

文笔不好,有不妥当之处欢迎交流 ^_^

转载于:https://www.cnblogs.com/huyujun/p/9604333.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值