实例讲解YII2中多表关联的使用方法


Posted in PHP onJuly 21, 2017

前言

本文对 YII2.0 的多表关联查询做一个简单的介绍。文中通过实例代码介绍的非常详细,下面话不多说,来一起看看详细的介绍:

首先先来说明一下表结构

表结构

现在有订单表、用户表、商品清单表、商品库存表

实例讲解YII2中多表关联的使用方法

实例讲解YII2中多表关联的使用方法

在YII中,如果想直接关联其他表进行查询的话,需要先在模型里定义它们的关联

Order

class Order extends \yii\db\ActiveRecord.{
 
 // 关联函数以get+要关联的数据表名来命名
 // 这是获取下订单的客户
 public function getUser(){
  
  // 第一个参数为要关联的子表模型类名,
  // 第二个参数指定 通过子表的user_id,关联主表的usesr_id字段
  // 这里写清楚点大概意思就是User.user_id => Order.user_id
 return $this->hasMany(User::className(), ['user_id' => 'user_id']);
 }
}

1、hasMany、hasOne使用

Yii2中的表之间的关联有2种,它们用来指定两个模型之间的关联。

      ●一对多:hasMany ●一对一:hasOne

      ●返回结果:这两个方法的返回结果都为yiidbActiveQuery对象(如果你想最后返回的是标准数组形式,记得加上asArray()参数)

      ●第一个参数:所关联的模型的类名称。

      ●第二个参数:是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。

关联的使用

现在我们来尝试获取一个订单

//获取订单信息
$order = Order::findOne(1);
//根据订单信息获取到用户信息
$user = $order->user;

当然你可以选择使用with方法,这样看起来简洁一些,其中with的参数为关系的名称,也就在model里面定义的getUser中的user.

//返回订单信息(包括用户信息)
$order = Order::find(1)->with('user');
//或者
$order = Order::find(1)->getUser();

上面的代码会生成并执行如下的sql语句

SELECT * FROM order WHERE id=1;
SELECT * FROM user  WHERE user.user_id=order.user_id;

从上面可以看出访问一个关联的时候有两种方法

       ●如果以函数的方式调用,会返回一个 ActiveQuery 对象($customer->getOrders()->all())

       ●如果以属性的方式调用,会直接返回模型的结果($customer->orders)

关联结果缓存

如果这时order表发生了改变,我们希望再次查询的话

$user = $order->user;

再次得到订单的时候你会发现没有变化。原因是只会在第一次执行$order->user的时候才会去数据库里面查询,然后会把结果缓存起来,以后查询的时候都不会再执行sql。

那么如果你想再次执行sql如何做呢?可以执行

//先释放缓存
unset($order->user);
$order->user;

跨表查询

下面重点来了!通过上面表结构的图可以看到,User表和Order_goods表示没有直接关联的,那么如果我们想根据用户信息查找这个用户买了哪些商品的话,就势必需要通过Order表去关联两张表。那么该怎么做呢?首先还是model层。因为我们是根据用户去查,所以到User的model层去定义关联。

User

public function getOrder() {
 return $this->hasMany(Order::className(), ['user_id' => 'user_id']);
}
 
public function getOrderGoods() {
 return $this->hasMany(OrderGoods::className(), ['order_id' => 'order_id'])->
  via('order');
}

这里注意:getOrderGoods中的第二个order_id是指getOrder关联的Order中的order_id,第一个order_id是指OrderGoods中的order_id。

但是!我们还有最简单的方法,那就是使用SQL语句啦!

$map = 'select
  user.name,
  order.id,
  order_goods.goods_id,
  goods.goods_name,
  stock.stock_count
  from user
  LEFT JOIN order   ON order.user_id = user.user_id
  LEFT JOIN order_goods ON order_goods.order_id = order.order_id
  LEFT JOIN goods   ON goods.goods_id = order_goods.goods_id
  LEFT JOIN stock   ON stock.goods_id = goods.goods_id';

$list1 = Article::findBySql($map)->asArray()->all();

这样基本就是整个关联部分了

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
php中根据变量的类型 选择echo或dump
Jul 05 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
php绘制一条直线的方法
Jan 24 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 #PHP
php实现基于pdo的事务处理方法示例
Jul 21 #PHP
php基于自定义函数记录log日志方法
Jul 21 #PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 #PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 #PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 #PHP
php检测mysql表是否存在的方法小结
Jul 20 #PHP
You might like
php判断是否为json格式的方法
2014/03/04 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
原生JS实现烟花效果
2020/03/10 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
python将图片文件转换成base64编码的方法
2015/03/14 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
2014新年寄语
2014/01/20 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
公证书格式
2015/01/23 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
农业项目合作意向书
2015/05/08 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
CentOS MySql8 远程连接实战
2022/04/19 MySQL