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 动态随机生成验证码类代码
Apr 09 PHP
PHP @ at 记号的作用示例介绍
Oct 10 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
详解PHP中的Traits
Jul 29 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
ThinkPHP中order()使用方法详解
Apr 19 PHP
php数组分页实现方法
Apr 30 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 17 PHP
基于PHP实现发微博动态代码实例
Dec 11 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
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
Js四则运算函数代码
2012/07/21 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
ionic3 懒加载
2017/08/16 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python字符串切片操作知识详解
2016/03/28 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
分公司任命书
2014/06/06 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
党员创先争优心得体会
2014/09/11 职场文书
迁户口计划生育证明
2014/10/19 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
小学六一主持词开场白
2015/05/28 职场文书
荒岛余生观后感
2015/06/09 职场文书
学生退学证明
2015/06/23 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android