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 相关文章推荐
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 PHP
php基于mcrypt的加密解密实例
Oct 27 PHP
PHP产生不重复随机数的5个方法总结
Nov 12 PHP
php中静态类与静态变量用法的区别分析
Jan 15 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 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数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
vue-cli配置环境变量的方法
2018/07/09 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
深入解析Python中的集合类型操作符
2015/08/19 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python socket实现简单聊天室
2018/04/01 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
Python pip使用超时问题解决方案
2020/08/03 Python
python 5个实用的技巧
2020/09/27 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
美国眼镜网站:LensCrafters
2020/01/19 全球购物
新闻专业个人自我评价
2013/09/21 职场文书
关于期中考试的反思
2014/02/02 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
师德师风整改措施
2014/10/24 职场文书
2015入党个人自传范文
2015/06/26 职场文书
python for循环赋值问题
2021/06/03 Python
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
介绍一下28个JS常用数组方法
2022/05/06 Javascript