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 相关文章推荐
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 PHP
php图片加水印原理(超简单的实例代码)
Jan 18 PHP
重新认识php array_merge函数
Aug 31 PHP
smarty表格换行实例
Dec 15 PHP
php实现递归与无限分类的方法
Feb 16 PHP
PHP中的traits简单使用实例
May 13 PHP
PHP-FPM实现性能优化
Mar 31 PHP
php+resumablejs实现的分块上传 断点续传功能示例
Apr 18 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 PHP
PHP7 错误处理机制修改
Mar 09 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 flock 文件锁详细介绍
2012/12/29 PHP
学习ExtJS form布局
2009/10/08 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
对python判断ip是否可达的实例详解
2019/01/31 Python
python面向对象法实现图书管理系统
2019/04/19 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
python异常处理try except过程解析
2020/02/03 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
python合并多个excel文件的示例
2020/09/23 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
个人求职信范文分享
2014/01/06 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
物控部经理职务说明书
2014/02/25 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
企业指导教师评语
2014/04/28 职场文书
给老师的感谢信
2015/01/20 职场文书
基于Python实现对比Exce的工具
2022/04/07 Python