表结构
现在有客户表、订单表、图书表、作者表,
客户表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;
新闻热点
疑难解答