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_flip() 将数组键名与值对调
Nov 07 PHP
深入PHP数据缓存的使用说明
May 10 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
php有道翻译api调用方法实例
Dec 22 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
php封装的smarty类完整实例
Oct 19 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
php中各种定义变量的方法小结
Oct 18 PHP
laravel5.6实现数值转换
Oct 23 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强大的时间转换函数strtotime
2016/02/18 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python 基础之字符串string详解及实例
2017/04/01 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
python生成随机图形验证码详解
2017/11/08 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
python已协程方式处理任务实现过程
2019/12/27 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
python包的导入方式总结
2021/03/02 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
学年末自我鉴定
2014/01/21 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
监督检查工作方案
2014/05/28 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
Java存储没有重复元素的数组
2022/04/29 Java/Android