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 相关文章推荐
Session的工作方式
Oct 09 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
ajax+php打造进度条 readyState各状态
Mar 20 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
PHP简单选择排序算法实例
Jan 26 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
分享php邮件管理器源码
Jan 06 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
详解webpack进阶之loader篇
2017/08/23 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
python使用socket远程连接错误处理方法
2015/04/29 Python
Python实例一个类背后发生了什么
2016/02/09 Python
详解Python字典小结
2018/10/20 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python 互换字典的键值对实例
2019/02/12 Python
python反编译学习之字节码详解
2019/05/19 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
小学教师岗位职责
2013/11/25 职场文书
餐饮加盟计划书
2014/01/10 职场文书
毕业设计论文评语
2014/12/31 职场文书
请客吃饭开场白
2015/06/01 职场文书
雷锋电影观后感
2015/06/10 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏