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

 更新时间:2017年07月21日 11:37:48   作者:xsctx7788  
最近工作中遇到了YII2多表关联的相关问题,发现网上这方面的资料并不多,所以想着自己整理下吧,方便自己在以后需要的时候或者有需要的朋友们参考学习,下面这篇文章主要给大家介绍了关于YII2中多表关联的使用方法,需要的朋友下面来一起看看吧。

前言

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

首先先来说明一下表结构

表结构

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

在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使用函数pathinfo()、parse_url()和basename()解析URL

    php使用函数pathinfo()、parse_url()和basename()解析URL

    众所周知在PHP中函数pathinfo()、parse_url()和basename(),这三个都是解析URL的函数,但是也存在一些区别,下面列举了一些实例,通过实例更容易理解这三个函数的使用方法和技巧,有需要的朋友可以参考借鉴,感兴趣的朋友们下面来一起学习学习吧。
    2016-11-11
  • 开源php中文分词系统SCWS安装和使用实例

    开源php中文分词系统SCWS安装和使用实例

    这篇文章主要介绍了开源php中文分词系统SCWS安装和使用实例,需要的朋友可以参考下
    2014-04-04
  • ThinkPHP框架使用redirect实现页面重定向的方法实例分析

    ThinkPHP框架使用redirect实现页面重定向的方法实例分析

    这篇文章主要介绍了ThinkPHP框架使用redirect实现页面重定向的方法,结合实例形式分析了thinkPHP中redirect进行页面重定向的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-04-04
  • Laravel框架实现model层的增删改查(CURD)操作示例

    Laravel框架实现model层的增删改查(CURD)操作示例

    这篇文章主要介绍了Laravel框架实现model层的增删改查(CURD)操作,结合实例形式分析了Laravel框架模型model层进行数据库的增删改查操作具体实现技巧,需要的朋友可以参考下
    2018-05-05
  • PHP调试及性能分析工具Xdebug详解

    PHP调试及性能分析工具Xdebug详解

    下面小编就为大家带来一篇PHP调试及性能分析工具Xdebug详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 在Win7 中为php扩展配置Xcache

    在Win7 中为php扩展配置Xcache

    XCache是一个又快又稳定的PHP opcode缓存器.经过良好的测试并在大流量/高负载的生产机器上稳定运行.经过(在linux上)测试并支持所有现行PHP分支的最新发布版本,如php5.0~5.6(x64和x86),并支持线程安全/Windows.与同类opcode缓存器相比更胜一筹, 比如能够快速跟进PHP版本.
    2014-10-10
  • php fckeditor 调用的函数

    php fckeditor 调用的函数

    showfck() 编辑器调用函数
    2009-06-06
  • 一个PHP实现的轻量级简单爬虫

    一个PHP实现的轻量级简单爬虫

    这篇文章主要介绍了一个PHP实现的轻量级简单爬虫,本文总结了爬虫的一些知识如爬虫的结构、正则表达式、其他问题等,然后给出了爬虫实现代码,需要的朋友可以参考下
    2015-07-07
  • 改写ThinkPHP的U方法使其路由下分页正常

    改写ThinkPHP的U方法使其路由下分页正常

    这篇文章主要介绍了改写ThinkPHP的U方法使其路由下分页正常的方法,需要的朋友可以参考下
    2014-07-07
  • PHP手机号中间四位用星号*代替显示的实例

    PHP手机号中间四位用星号*代替显示的实例

    本篇文章主要介绍了PHP手机号中间四位用星号*代替显示的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论