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

发布时间 - 2026-01-11 02:27:02    点击率:

前言

本文对 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();

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

总结

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


# yii2  # 多表关联  # yii2多表关联查询  # yii2多表关联查询语句  # Yii2中使用join、joinwith多表关联查询  # Yii2 ActiveRecord多表关联及多表关联搜索的实现  # Yii2中多表关联查询hasOne hasMany的方法  # 第一个  # 第二个  # 是指  # 你想  # 的是  # 是一个  # 这是  # 来了  # 就在  # 都不  # 你可以  # 买了  # 会在  # 这两个  # 可以看到  # 做一个  # 怎么做  # 可以看出  # 会把  # 这篇文章 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: linux写shell需要注意的问题(必看)  如何在建站宝盒中设置产品搜索功能?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Python自动化办公教程_ExcelWordPDF批量处理案例  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  昵图网官方站入口 昵图网素材图库官网入口  高端网站建设与定制开发一站式解决方案 中企动力  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  深圳网站制作的公司有哪些,dido官方网站?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel Fortify是什么,和Jetstream有什么关系  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  再谈Python中的字符串与字符编码(推荐)  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Android滚轮选择时间控件使用详解  进行网站优化必须要坚持的四大原则  如何在IIS中新建站点并解决端口绑定冲突?  百度浏览器如何管理插件 百度浏览器插件管理方法  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  网易LOFTER官网链接 老福特网页版登录地址  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  深圳网站制作平台,深圳市做网站好的公司有哪些?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  简单实现Android验证码  简单实现jsp分页  如何用PHP工具快速搭建高效网站?  如何用美橙互联一键搭建多站合一网站?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  独立制作一个网站多少钱,建立网站需要花多少钱?  使用Dockerfile构建java web环境  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  HTML 中动态设置元素 name 属性的正确语法详解  香港服务器WordPress建站指南:SEO优化与高效部署策略