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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
PHP XML操作的各种方法解析(比较详细)
Jun 17 PHP
关于尾递归的使用详解
May 02 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
PHP之autoload运行机制实例分析
Aug 28 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
php微信公众号开发之校园图书馆
Oct 20 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 var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
在python中实现对list求和及求积
2018/11/14 Python
python实现简易数码时钟
2021/02/19 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
学习党章思想汇报
2014/01/07 职场文书
网页美工求职信范文
2014/04/17 职场文书
爱耳日活动总结
2014/04/30 职场文书
老干部工作先进事迹
2014/08/17 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
清明节随笔
2015/08/15 职场文书
部门主管竞聘书
2015/09/15 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript