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 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
php基础教程 php内置函数实例教程
Aug 21 PHP
php向js函数传参的几种方法
Aug 10 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
php接口数据加密、解密、验证签名
Mar 12 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP的cookie与session原理及用法详解
Sep 27 PHP
如何在Mac上通过docker配置PHP开发环境
May 29 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自定义分页类完整实例
2015/12/25 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
深入理解JavaScript定时机制
2010/10/29 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
jquery实现加载等待效果示例
2013/09/25 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
Angular实现响应式表单
2017/08/04 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
学习Python selenium自动化网页抓取器
2018/01/20 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
django实现类似触发器的功能
2019/11/15 Python
python关于倒排列的知识点总结
2020/10/13 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
Delphi CS笔试题
2014/01/04 面试题
计算机网络专业推荐信
2013/11/24 职场文书
高级护理专业毕业生推荐信
2013/12/25 职场文书
党员剖析材料范文
2014/09/30 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
成事在人观后感
2015/06/16 职场文书
致运动员加油稿
2015/07/21 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
vue 实现上传组件
2021/05/31 Vue.js