yii框架数据库关联查询操作示例


Posted in PHP onOctober 14, 2019

本文实例讲述了yii框架数据库关联查询操作。分享给大家供大家参考,具体如下:

<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\Customer;
class CustomerController extends Controller{
  //根据顾客名字查询出所有的订单信息
  public function actionIndex(){
    $customer = Customer::find()->where(['name'=>'zhangsan'])->one();
    $orders = $customer->hasMany('app\models\Order',['customer_id'=>'id'])->asArray()->all();
    print_r($orders);
  }
}
?>

上边的控制器方法查询,Customer模型没有具体方法。

上边的 app\models\Order 可以改进为Order::className(),并且上边要添加use app\models\Order;

方式二:(使用model方法)

customer模型代码:

<?php
namespace app\models;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord{
  public function getOrders(){
    return $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all();
  }
}

控制器代码:

namespace app\controllers;
use yii\web\Controller;
use app\models\Customer;
class CustomerController extends Controller{
  //根据顾客名字查询出所有的订单信息
  public function actionIndex(){
    $customer = Customer::find()->where(['name'=>'zhangsan'])->one();
    $orders = $customer->getOrders();
    print_r($orders);
  }
}

方法三:(调用模型的属性查询)

customer模型代码:

namespace app\models;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord{
  public function getOrders(){
    return $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray();
  }
}

控制器代码:

namespace app\controllers;
use yii\web\Controller;
use app\models\Customer;
class CustomerController extends Controller{
  //根据顾客名字查询出所有的订单信息
  public function actionIndex(){
    $customer = Customer::find()->where(['name'=>'zhangsan'])->one();
    $orders = $customer->orders;
    //说明,当调用一个不存在的属性时,
    //php会去调用一个__get()的方法,
    //__get()的方法会自动调用一个get+属性的方法,即getOrders()
    //并且会再查询时自动补上->all()或->one()方法,根据模型查询的hasMany或hasOne决定的
    print_r($orders);
  }
}

根据订单id获取对应的顾客信息:

模型代码:

namespace app\models;
use yii\db\ActiveRecord;
class Order extends ActiveRecord{
  //根据订单id获取顾客信息
  public function getCustomer(){
    return $this->hasOne(Customer::className(),['id'=>'customer_id'])->asArray();
  }
}

控制器代码:

namespace app\controllers;
use yii\web\Controller;
use app\models\Order;
class CustomerController extends Controller{
  //根据订单查询用户信息
  public function actionIndex(){
    $orders = Order::find()->where(['id'=>2])->one();
    $customer = $orders->customer;
    print_r($customer);
  }
}

以上代码中的$orders->customer会记录缓存,如果要删除缓存,可以使用unset($orders->customer)

关联查询的多次查询

$customers = Customer::find()->all();
foreach($customers as $customer){
  $orders = $customer->orders;
}

这样如果有100条数据,就总共需要查询101次。

优化:

$customers = Customer::find()->with('orders')->all();
foreach($customers as $customer){
  $orders = $customer->orders;
}

总共查询两次。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
手把手教你使用DedeCms V3的在线采集图文教程
Apr 03 PHP
什么是MVC,好东西啊
May 03 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
Symfony学习十分钟入门经典教程
Feb 03 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 #PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 #PHP
laravel 多图上传及图片的存储例子
Oct 14 #PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 #PHP
Laravel开启跨域请求的方法
Oct 13 #PHP
浅谈Laravel中的三种中间件的作用
Oct 13 #PHP
laravel config文件配置全局变量的例子
Oct 13 #PHP
You might like
编写PHP的安全策略
2006/10/09 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
Vue路由权限控制解析
2020/11/09 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
详解Django中间件执行顺序
2018/07/16 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
python RSA加密的示例
2020/12/09 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
建筑毕业生自我鉴定
2013/10/18 职场文书
自荐信封面
2013/12/04 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL