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的FTP学习(一)
Oct 09 PHP
傻瓜化配置PHP环境――Appserv
Dec 13 PHP
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 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
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
python字典操作实例详解
2017/11/16 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
python区块及区块链的开发详解
2019/07/03 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
大学生求职简历的自我评价
2013/10/21 职场文书
留守儿童工作方案
2014/06/02 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
安全保证书
2015/01/16 职场文书
2016公司新年问候语
2015/11/11 职场文书
Python数据结构之队列详解
2022/03/21 Python
Python作用域和名称空间的详细介绍
2022/04/13 Python