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设计模式 Proxy (代理模式)
Jun 26 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
Drupal7中常用的数据库操作实例
Mar 02 PHP
php实现水仙花数示例分享
Apr 03 PHP
php绘制圆形的方法
Jan 24 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 PHP
yii2简单使用less代替css示例
Mar 10 PHP
关于php 高并发解决的一点思路
Apr 16 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 面向对象详解
2012/09/13 PHP
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
自荐信模板大全
2015/03/27 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
观后感的写法
2015/06/19 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书