`Customer.php`:
~~~
class Customer extends \yii\db\ActiveRecord
{
public function getOrder()
{
//第一个customer_id是Order表中的字段,第二个customer_id是Customer表中的字段
//比如查询1号订单的顾客资料,1号订单的customer_id=1
//然后在Customer表中查询customer_id=1的顾客资料
return $this->hasMany(Order::className(),['customer_id' => 'customer_id'])->asArray()->all();
}
}
~~~
* * * * *
`Order.php`
~~~
class Order extends \yii\db\ActiveRecord
{
public function getCustomer()
{
//第一个customer_id是Customer表中的字段,第二个customer_id是Order表中的字段
//比如查询zhangsan的订单,zhangsan的customer_id=1
//然后在Order表中查询customer_id=1的订单
return $this->hasOne(Customer::className(),['customer_id' => 'customer_id'])->asArray()->one();
}
}
~~~
* * * * *
控制器的方法:
~~~
function actionOrder()
{
/******************************* 关联查询 ****************************/
/********** 1、根据顾客名字查询顾客订单,顾客1:n订单 ******/
//查询zhangsan的订单
$customer = Customer::find()->where(['name' => 'zhangsan'])->one();
$order = $customer->getOrder();
print_r($order);
/********** 2、根据订单查询顾客名字,订单1:1顾客 *********/
//查询1号订单的顾客资料
$order = Order::find()->where(['order_id' => 1])->one();
$customer = $order->getCustomer();
print_r($customer);
/**** $customer = $orders->customer;
* 3、当访问不存在的属性时$orders->customer,php会自动调用__get()
* 即$orders->customer相当于调用$orders->getCustomer()
* 同时还会在末尾自动补上one()方法,即$orders->getCustomer()->one()
* 因此,当你使用$orders->customer时,要在getCustomer()方法末尾要去掉one() *****/
/********************* 关联查询问题1:关联查询结果会被缓存 **********************/
/* 当你执行 $order=Order::find()->where(['order_id' => 1])->one() 时,往数据表进行了查询
* 第二次执行 $order=Order::find()->where(['order_id' => 1])->one() 时则不会从数据表中进行查询,会直接从缓存中读取
* 所以当你更新数据表的时候,你查询到的结果却没有更新,此时你需要先unset($order)删除缓存再从数据表中查询 */
/********************* 关联查询问题2:关联查询的多次查询 **********************/
$customers=Customer::find()->all(); //1次sql语句select * from customer
foreach($customers as $customer){
//如果Customer表中有100条记录,则会执行100次sql语句select * from order where customer_id=...
print_r($customer->order);
}
/*解决方法:加上with('order')
* select * from customer,select * from order where customer_id in(...),这时的...表示所有顾客customer_id的集合
* 选取所有顾客的customer_id塞到各自的order属性,执行下面foreach时不会再有sql语句,这里只执行了2次sql语句*/
/*$customers=Customer::find()->with('order')->all();
foreach($customers as $customer){
print_r($customer->order);
}*/
}
~~~
- 前文
- 安装前的准备
- windows安装Composer
- Linux安装Composer
- 开始使用
- 安装yii2.0
- 初始化项目
- 检测运行环境
- 数据库
- 连接数据库
- 添加
- 查询
- join
- joinWith
- with
- asArray
- offset
- filterWhere
- 关联查询
- 更新
- AR更新
- with和JoinWith的区别?
- Yii2.0框架基础--数据查询之AR类方法一
- 数据库迁移Migration
- 查看最后执行SQL语句
- 事务处理
- 例子
- 控制器
- rules验证方法
- behaviors行为
- actions动作
- 模型
- 模型使用
- attributeLabels
- tableName
- fields
- 视图
- 显示视图
- 获取配置参数
- 格式化时间显示
- Activeform效果
- Activeform表单部分组件使用方法
- RESTful服务
- 版本化控制
- 邮件mail
- 邮件配置
- 邮件样板
- session
- Yii2.0 Session操作大全(增、删、改、销毁、Session数组赋值、读取)
- 缓存
- 跨APP读取缓存(文件缓存)
- Memcache
- 最佳实践
- 控制器
- 模型
- 视图
- 常见问题
- 解决根目录没有vendor目录
- 安装composer-asset插件错误
- Url隐藏index.php
- nginx配置
- Apache配置
- 配置
- 设置系统默认中文提示
- 数据库问题
- where和andWhere不能同时使用吗?
- debug
- 编辑器使用技巧
- phpstorm
- Redis
- redis安装
- redis例子
- RBAC
- Redis和memcache概念
- 生成接口文档
- Swagger安装
- Swagger语法
- 扩展
- 七牛云存储
- 视频缩略图
- Pjax
- A链接不能跳转解决办法