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 array的学习笔记
May 10 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
php获取图片信息的方法详解
Dec 10 PHP
php中namespace use用法实例分析
Jan 22 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 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
随机广告显示(PHP函数)
2006/10/09 PHP
PHP 学习路线与时间表
2010/02/21 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
javascript是怎么继承的介绍
2012/01/05 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
Promise扫盲贴
2019/06/24 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
python异步存储数据详解
2019/03/19 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python解析多层json操作示例
2019/12/30 Python
python随机模块random使用方法详解
2020/02/14 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
python实现粒子群算法
2020/10/15 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
法学专业应届生求职信
2013/10/16 职场文书
如何写你的创业计划书
2014/01/07 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书