前言
本文对 yii2.0 的多表关联查询做一个简单的介绍。文中通过实例代码介绍的非常详细,下面话不多说,来一起看看详细的介绍:
首先先来说明一下表结构
表结构
现在有订单表、用户表、商品清单表、商品库存表
在yii中,如果想直接关联其他表进行查询的话,需要先在模型里定义它们的关联
order
1、hasmany、hasone使用
yii2中的表之间的关联有2种,它们用来指定两个模型之间的关联。
●一对多:hasmany ●一对一:hasone
●返回结果:这两个方法的返回结果都为yiidbactivequery对象(如果你想最后返回的是标准数组形式,记得加上asarray()参数)
●第一个参数:所关联的模型的类名称。
●第二个参数:是一个数组,其中键为所关联的模型中的属性,值为当前模型中的属性。
关联的使用
现在我们来尝试获取一个订单
当然你可以选择使用with方法,这样看起来简洁一些,其中with的参数为关系的名称,也就在model里面定义的getuser中的user.
上面的代码会生成并执行如下的sql语句
从上面可以看出访问一个关联的时候有两种方法
●如果以函数的方式调用,会返回一个 activequery 对象($customer->getorders()->all())
●如果以属性的方式调用,会直接返回模型的结果($customer->orders)
关联结果缓存
如果这时order表发生了改变,我们希望再次查询的话
再次得到订单的时候你会发现没有变化。原因是只会在第一次执行$order->user的时候才会去数据库里面查询,然后会把结果缓存起来,以后查询的时候都不会再执行sql。
那么如果你想再次执行sql如何做呢?可以执行
跨表查询
下面重点来了!通过上面表结构的图可以看到,user表和order_goods表示没有直接关联的,那么如果我们想根据用户信息查找这个用户买了哪些商品的话,就势必需要通过order表去关联两张表。那么该怎么做呢?首先还是model层。因为我们是根据用户去查,所以到user的model层去定义关联。
user
这里注意:getordergoods中的第二个order_id是指getorder关联的order中的order_id,第一个order_id是指ordergoods中的order_id。
但是!我们还有最简单的方法,那就是使用sql语句啦!
这样基本就是整个关联部分了
总结
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对硕编程的支持。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!