yii2如何使用关联模型?

yii2如何使用关联模型?
2021-10-18 11:00:18 0
本文 1938 个字,阅读需要大约 4 分钟

文章目录 [回顶部]
[--评论--]

前言

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

首先先来说明一下表结构

表结构

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

 

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

Order

1

2

3

4

5

6

7

8

9

10

11

12

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

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

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

关联的使用

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

1

2

3

4

//获取订单信息

$order = Order::findOne(1);

//根据订单信息获取到用户信息

$user = $order->user;

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

1

2

3

4

//返回订单信息(包括用户信息)

$order = Order::find(1)->with('user');

//或者

$order = Order::find(1)->getUser();

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

1

2

SELECT * FROM order WHERE id=1;

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

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

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

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

关联结果缓存

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

1

$user = $order->user;

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

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

1

2

3

//先释放缓存

unset($order->user);

$order->user;

跨表查询

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

User

1

2

3

4

5

6

7

8

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

1

2

3

4

5

6

7

8

9

10

11

12

13

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

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

以上就是本文的全部内容啦,有什么疑问欢迎在下方评论区留言嗷,收到通知会及时回复~
文章浏览总量:756 (非即时 )
Comments
Nothing...
||||
# markdown..
 
100:0
推荐文章 使用余弦向量算法进行推荐(分数)
linux文件系统解释
linux文件系统解释
leorain
0
2021-11-18 15:49:02
≈ 68.7500
linux下的top命令参数说明 (virt,res,shr,data 的意义)
linux下的top命令参数说明 (virt,res,shr,data 的意义)
leorain
0
2022-06-17 10:58:35
≈ 67.9900
nginx 内置变量
nginx 内置变量、自定义变量、$args、$uri、$request_uri 等变量的解释
leorain
0
2023-01-12 21:18:16
≈ 67.4800
解决使用Navicat连接远程数据库速度非常慢的方法
最近新安装了homestead,发现使用navicat链接远程的homestead里面的数据库的时候很卡,在搜索后发现原来是一下参数影响了链接速度
leorain
0
2021-09-06 15:20:00
≈ 67.4600
ubuntu设置文件夹共享
ubuntu 文件夹共享,实现 linux -- linux 或者 linux -- windows 文件夹共享
leorain
1
2022-03-01 14:06:16
≈ 66.9300
算法实现-快速排序
快速排序是目前使用最多的排序方式之一,也是平均速度较快的排序方式之一。快速排序采用分而治之的思想,将数组分为两部分,一部分的元素小于或等于基准元素,另一部分元素大于或等于基准元素。然后递归的对这两部分进行快速排序,得到最终排序后的数据。
leorain
0
2025-01-24 00:41:11
≈ 66.7700
redis镜像站
镜像站从主服务器读取redis文件,并持续更新从服务器的redis服务
leorain
0
2021-08-10 23:33:00
≈ 66.6000
《小宇》
我相信有一天我也会遇到我的小宇,不管结局怎么样,我都想和她在一起
leorain
1
2021-09-07 21:02:00
≈ 66.5700
linux禁止用户登录
ssh 用户认证流程讲解、禁止用户登录、创建禁止登录的用户、ssh 管道创建端口转发等
leorain
0
2022-09-08 21:24:07
≈ 66.0400
跳转到顶部