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
用ODBC的分页显示
Oct 09 PHP
我用php+mysql写的留言本
Oct 09 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
Yii2实现ajax上传图片插件用法
Apr 28 PHP
php短信接口代码
May 13 PHP
Laravel实现autoload方法详解
May 07 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 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中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
js实现select下拉框选择
2020/01/11 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
在Python中编写数据库模块的教程
2015/04/29 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Python实现八大排序算法
2016/08/13 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
Python退火算法在高次方程的应用
2018/07/26 Python
python issubclass 和 isinstance函数
2019/07/25 Python
Python3 元组tuple入门基础
2020/02/09 Python
python3将变量输入的简单实例
2020/08/19 Python
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
职务任命书范本
2014/06/05 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
公司禁烟通知
2015/04/23 职场文书