yii多表查询--学习随笔

今天自己做一个小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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node --- 创建一个Socket服务器

流程: 会开发一个监听文件改变的应用然后客户端使用命令行工具(telnet)连接服务端服务端在监听到文件变化后,会发送数据给客户端 监听文件变化 node 的fs模块:watch方法用于监听文件的变化,可以在内存分配一个区域,来专门用于监听文件变化,并执行该区域内指定的回调函数 //…

Laravel中数据库的操作

查找数据库的三种方式 DB facade(原始查找)查询构造Eloquent ORM新建数据表 //示例表 create table if not exits student( ‘id’ int auto_increment primaary key, ‘name’ varchar(255) not null default “”comment’姓名’, ‘age’ tinyint usigned not null defa…

node --- 创建一个Socket客户端连接到服务器

描述: net.createrServer().listen(60300) 监听客户端访问net.connect({ port: 60300 }) 访问服务器 服务器: 一个很简单的监听文件改变的服务器每当监听的文件改变了,将信息通过json的格式传递给连接到的客户端 connection.write // 01、net-watcher.js use strict const …

Laravel中的Blade模版

Blade模版简介 Blade模版的好处&#xff1a; 模版继承&#xff08;template inheritance&#xff09;视图片段&#xff08;sections&#xff09;部分指令&#xff1a; extend(‘xxx’)为子页面指定所继承的页面布局模版section(‘xxx’)为子页面提供所继承的页面中指定的部分…

三元表达式,列表解析和生成器表达式

三元表达式 在以前&#xff0c;在诸如比较两个数大小的时候&#xff0c;通常的写法都是下面的样子 if x > y:print("the max is x") else:print("the max is y") 三元表达式的语法为&#xff1a; True if expression else False 现在可以个体三元表达式…

Mysql 如何设置字段自动获取当前时间,附带添加字段和修改字段的例子

--添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE table_nameADD COLUMN CreateTime datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ; --修改CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE table_nameMODIFY COLUMN CreateTime datetim…

css --- 圣杯布局

圣杯布局 左右固定宽度,中间自适应div:nth-child(1) section {display: flex;width: 60%;height: 150px;background-color: pink;margin: 0 auto; }section div:nth-child(1) {width: 100px;height: 150px;background-color: red; }section div:nth-child(2) {flex: 1;backgr…

FZU OJ:2230 翻翻棋

Problem 2230 翻翻棋Accept: 872 Submit: 2132Time Limit: 1000 mSec Memory Limit : 32768 KBProblem Description象棋翻翻棋&#xff08;暗棋&#xff09;中双方在4*8的格子中交战&#xff0c;有时候最后会只剩下帅和将。根据暗棋的规则&#xff0c;棋子只能上下左右移…

关于字符串比较时候出现的空指针问题的坑

比如说&#xff1a;String Tname driver.getTrueName(&#xff09;; 这个变量是从driver对象中取出的&#xff0c;但是你不知道这个值是空值null&#xff1b; 这个时候如果你这么写&#xff1a;Tname.equals("张三") 这个时候就会报空指针异常的 修改&#xff1a…

PHP 实现快速排序

首先了解快速排序的原理&#xff1a; 1、先取一个基值&#xff0c;用于每次的标准定位。 2、遍历数组&#xff0c;将大于基值的放到右边数组&#xff0c;小于的放到左边数组 3、将每次的左右数组和基值一起合并 代码实现&#xff1a; //快速排序 function quick_sort($arr…

css --- flex:n的解析

起步 效果如下: 在父元素中,将3个盒子平均分成了3等份代码如下: p span {flex: 1;background-color: lightcoral; }p span:nth-child(even) {border-right: 1px solid black;border-left: 1px solid black; }假设有3个子元素flex:1 的意思是,将剩余的宽度平均分成3份,然后该元…

1070: [SCOI2007]修车

/*一开始以为是个贪心 发现自己太naive了将每个技术工人拆成n个点&#xff0c;一共拆n*m个&#xff0c;第i个表示倒数第i次修车。 让每辆车向拆出来的点连边&#xff0c;费用为tmp[i][j]*k&#xff0c;i是技工&#xff0c;j是车&#xff0c;k是拆出来的第几个点&#xff0c; 这…

PHP 实现冒泡排序

PHP 实现冒泡排序 直接上代码 //冒泡排序 function bubble_sort($array){$count count($array);if ($count<0) {return false;}for ($i0; $i <$count ; $i) { for ($j0; $j <$count-$i-1 ; $j) { if ($array[$j]>$array[$j1]) {$tmp $array[$j1];$array[$j1]$a…

node --- 后端使用bcrypt对密码进行加密处理

密码的处理 加密处理在线调试: http://www.atool9.com/hash.phpbcrypt: 加密工具安装 && 使用 npm install --save bcryptconst bcrypt require(bcrypt); const SALT_WORK_FACTOR 10;const UserSchema new Schema({UserId: {type: ObjectId},password: String })U…

统一建模语言UML

目录 1. UML定义2. UML结构2.1 视图&#xff08;View&#xff09;2.2 图&#xff08;Diagram&#xff09;2.3 模型元素&#xff08;Model element&#xff09;2.4 通用机制&#xff08;General mechanism&#xff09;3. 类图3.1 类与类图3.2 类之间的关系3.2.1 关联关系3.2.2 聚…

SpringCloud系列七:使用Ribbon实现客户端侧负载均衡

1. 回顾 在前面&#xff0c;已经实现了微服务的注册与发现。启动各个微服务时&#xff0c;Eureka Client会把自己的网络信息注册到Eureka Server上。 但是&#xff0c;在生成环境中&#xff0c;各个微服务都会部署多个实例&#xff0c;因此还行继续进行优化。 2. Ribbon简介 Ri…

node --- 使用koa-router,让后端模块化

使用Koa-router进行路由管理 npm install --save koa-router const Router require(koa-router); let router new Router(); router.get(/, async (ctx)>{ctx.body 用户操作首页 })路由模块化 在appApi下面创建需要模块化的文件如:home.js、user.js const Router re…

PHP 实现桶排序

PHP 实现桶排序 <?phpfunction Bucket_sort($array){//初始化桶大小$min min($array);$max max($array);$book array_fill($min, $max-$min1, 0);//将要进行的数据进行计数foreach ($array as $key) {$book[$key];// echo $book[$key];}//返回数据$resArr array();for…

springboot ajax返回html

因为拦截器 或者是 shiro 拦截登陆接口 转载于:https://www.cnblogs.com/xdcr/p/9638569.html

【小试牛刀】短信验证码(随机数)的生成实现

短信验证码&#xff0c;相信在生活中大家是几乎天天能够遇到。但你知道它是怎样生成的吗&#xff1f;其实它就是若干位数的随机数组合而成。下面附上一小段程序&#xff0c;供大家一起学习交流。package com.fhcq.util;import org.apache.commons.lang3.RandomStringUtils;publ…