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 相关文章推荐
拼音码表的生成
Oct 09 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
PHP 文件系统详解
Sep 13 PHP
PHP截断标题且兼容utf8和gb2312编码
Sep 22 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
详解php反序列化
Jun 10 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
我的php学习笔记(毕业设计)
2012/02/21 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
js实现登录与注册界面
2017/11/01 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
vue实现选中效果
2020/10/07 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
Python中的类与类型示例详解
2019/07/10 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
高一政治教学反思
2014/01/28 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
工伤事故证明
2014/10/20 职场文书
公司2014年度工作总结
2014/12/10 职场文书
小学母亲节活动总结
2015/02/10 职场文书
2015年林业工作总结
2015/05/14 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
关于Vue中的options选项
2022/03/22 Vue.js