PHP   发布时间:2019-11-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了实例讲解YII2中多表关联的使用方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

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

首先先来说明一下表结构

表结构

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

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

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

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

Order

php;"> 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()参数)

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

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

关联的使用

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

user;

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

with('user'); //或者 $order = Order::find(1)->getUser();

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

php;"> 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的时候才会去数据库里面查询,然后会把结果缓存起来,以后查询的时候都不会再执行sql

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

user); $order->user;

跨表查询

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

User

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语句啦!

php;"> $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();

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

总结

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

大佬总结

以上是大佬教程为你收集整理的实例讲解YII2中多表关联的使用方法全部内容,希望文章能够帮你解决实例讲解YII2中多表关联的使用方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。