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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
用PHP+MySQL搭建聊天室功能实例代码
Aug 20 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
基于PHP文件操作的详解
2013/06/05 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python日志syslog使用原理详解
2020/02/18 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
公益活动邀请函
2014/02/05 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
中班教师个人总结
2015/02/05 职场文书
五一劳动节活动总结
2015/02/09 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书