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后台程序与Javascript的两种交互方式
Oct 25 PHP
ajax实现无刷新分页(php)
Jul 18 PHP
JS 网站性能优化笔记
May 24 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
10个值得深思的PHP面试题
Nov 14 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 PHP
PHP中mysqli_get_server_version()的实例用法
Feb 03 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
jquery 操作DOM案例代码分享
2012/04/05 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
Django与遗留的数据库整合的方法指南
2015/07/24 Python
python 列表降维的实例讲解
2018/06/28 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
造价工程师个人求职信
2013/09/21 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
归元寺导游词
2015/02/06 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang