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 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
让PHP支持页面回退的两种方法[转]
Feb 14 PHP
php不用正则采集速度探究总结
Mar 24 PHP
PHP 过滤页面中的BOM(实现代码)
Jun 29 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
一个经典的PHP验证码类分享
Nov 18 PHP
使用Thinkphp框架开发移动端接口
Aug 05 PHP
PHP使用Pear发送邮件(Windows环境)
Jan 05 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
PDO::query讲解
Jan 29 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 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代码
2016/08/08 PHP
php扩展开发入门demo示例
2019/09/23 PHP
Prototype RegExp对象 学习
2009/07/19 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
js创建对象的方式总结
2015/01/10 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
python 简单的多线程链接实现代码
2016/08/28 Python
使用Python对SQLite数据库操作
2017/04/06 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
flask框架路由常用定义方式总结
2019/07/23 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
python实现PCA降维的示例详解
2020/02/24 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
python实现mean-shift聚类算法
2020/06/10 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
校本教研工作方案
2014/01/14 职场文书
中秋节主持词
2014/04/02 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle