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 反射机制实现动态代理的代码
Oct 22 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
php 获取全局变量的代码
Apr 21 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
Jul 19 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
php结合js实现点击超链接执行删除确认操作
Oct 31 PHP
php文件操作相关类实例
Jun 18 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
PHP项目多语言配置平台实现过程解析
May 18 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
php判断linux下程序问题实例
2015/07/09 PHP
PHP错误机制知识汇总
2016/03/24 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
js 对象是否存在判断
2009/07/15 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
pytyon 带有重复的全排列
2013/08/13 Python
Python判断变量是否已经定义的方法
2014/08/18 Python
使用python加密自己的密码
2015/08/04 Python
Python数组定义方法
2016/04/13 Python
Python之时间和日期使用小结
2019/02/14 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
超市总经理岗位职责
2014/02/02 职场文书
运动会横幅标语
2014/06/17 职场文书
体育教师求职信
2014/06/30 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
js前端图片加载异常兜底方案
2022/06/21 Javascript