首页 > 开发 > Php > 正文

Yii2中使用join、joinwith多表关联查询

2020-02-21 21:07:05
字体:
来源:转载
供稿:网友

表结构

现在有客户表、订单表、图书表、作者表,

客户表Customer (id customer_name)
订单表Order (id order_name customer_id book_id)
图书表 (id book_name author_id)
作者表 (id author_name)

模型定义

下面是这4个个模型的定义,只写出其中的关联

Customer

class Customer extends /yii/db/ActiveRecord{// 这是获取客户的订单,由上面我们知道这个是一对多的关联,一个客户有多个订单public function getOrders(){// 第一个参数为要关联的子表模型类名,// 第二个参数指定 通过子表的customer_id,关联主表的id字段return $this->hasMany(Order::className(), ['customer_id' => 'id']);}}

Order

class Order extends /yii/db/ActiveRecord{// 获取订单所属用户public function getCustomer(){//同样第一个参数指定关联的子表模型类名//return $this->hasOne(Customer::className(), ['id' => 'customer_id']);}// 获取订单中所有图书public function getBooks(){//同样第一个参数指定关联的子表模型类名//return $this->hasMany(Book::className(), ['id' => 'book_id']);}}

Book

class Book extends /yii/db/ActiveRecord{// 获取图书的作者public function getAuthor(){//同样第一个参数指定关联的子表模型类名return $this->hasOne(Author::className(), ['id' => 'author_id']);}}

Author

class Autor extends /yii/db/ActiveRecord{}

hasMany、hasOne使用

Yii2中的表之间的关联有2种,它们用来指定两个模型之间的关联。

一对多:hasMany

一对一:hasOne

返回结果:这两个方法的返回结果都为yii/db/ActiveQuery对象

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

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

关联的使用

现在我们获取一个客户的所有的订单信息

// 获取一个客户信息$customer = Customer::findOne(1);$orders = $customer->orders; // 通过在Customer中定义的关联方法(getOrders())来获取这个客户的所有的订单。

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

SELECT * FROM customer WHERE id=1;SELECT * FROM order WHERE customer_id=1;

关联结果缓存

如果客户的订单改变了,我们再重新调用

$orders = $customer->orders;

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

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

unset($customer->orders);$customer->orders;            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表