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 09 PHP
PHP 一个随机字符串生成代码
May 26 PHP
PHP 函数学习简单小结
Jul 08 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 25 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
CURL状态码列表(详细)
2013/06/27 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
JS Timing
2007/04/21 Javascript
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
Python去除字符串两端空格的方法
2015/05/21 Python
python中map()与zip()操作方法
2016/02/27 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
对Django外键关系的描述
2019/07/26 Python
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
阅兵口号
2014/06/19 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
字节飞书面试promise.all实现示例
2022/06/16 Javascript
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技