YII框架关联查询操作示例


Posted in PHP onApril 29, 2019

本文实例讲述了YII框架关联查询操作。分享给大家供大家参考,具体如下:

以customer order两个表为例

关联查询控制器中

$customer = Customer::find()->where('name'=>'zhangsan')->one();
$orders = $customer->hasmany('orders',['customer_id']=>'id')->asArray()->all();
$orders = $customer->hasmany(Order::className(),['customer_id']=>'id')->asArray()->all();

customer模型中(优化)

public function getOrders(){
$orders = $this->hasmany('orders',['customer_id']=>'id')->asArray()->all();
}

关联查询控制器中就可以这么写

$customer = Customer::find()->where('name'=>'zhangsan')->one();
$orders = $customer->getOrders();

甚至可以这么写

$orders = $customer->orders;

当获取未定义的类属性时会触发类的__get()魔术方法效果 YII会自动调用 getOrders()方法,而且会加上->all(),所以定义getOrders()时不能带上all()

Order模型

public function getCustomer(){
$this->hasOne(Customer::className,['id'=>'customer_id'])->asArray();
}

关联查询控制器中这么写

$order = Order::find()->where("id"=>'1')->one();
$customer = $order->customer;

注意点

1.关联查询会被缓存

所以

$customer = Customer::find()->where('name'=>'zhangsan')->one();
unset($customer->orders);//清掉缓存
$order = $customer->orders;

2.关联查询的多次查询

$customers = Customer::find()->all();//select * from customer
foreach($customers as $customer){
$order = $customer->orders;//select * from order where customer_id = ...
}

以上代码执行了101次sql查询,可以进行如下优化

$customers = Customer::find()->with('orders')->all();//select * from customer
foreach($customers as $customer){
$order = $customer->orders();//select * from order where customer_id in (...)
}//变成了2次查询

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php读取数据库信息的几种方法
May 24 PHP
php 获取客户端的真实ip
Nov 30 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
php导出word格式数据的代码实例
Nov 25 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
php数字运算验证码的实现代码
Jul 30 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
YII框架页面缓存操作示例
Apr 29 #PHP
YII框架http缓存操作示例
Apr 29 #PHP
PHP常见的几种攻击方式实例小结
Apr 29 #PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 #PHP
详解提高使用Java反射的效率方法
Apr 29 #PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 #PHP
详解php中生成标准uuid(guid)的方法
Apr 28 #PHP
You might like
Symfony核心类概述
2016/03/17 PHP
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python的一些用法分享
2012/10/07 Python
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
Django URL参数Template反向解析
2020/11/24 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
关于抽烟的检讨书
2014/02/25 职场文书
单位绩效考核方案
2014/05/11 职场文书
入职担保书怎么写
2014/05/12 职场文书
节约用水演讲稿
2014/05/21 职场文书
酒店开业策划方案
2014/06/02 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang