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 翻页 实例代码
Aug 07 PHP
PHP 字符串分割和比较
Oct 06 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
php获取apk包信息的方法
Aug 15 PHP
php绘制一个扇形的方法
Jan 24 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 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学习之数据类型之间的转换介绍
2011/06/09 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
python多线程之事件Event的使用详解
2018/04/27 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
浅谈Python __init__.py的作用
2020/10/28 Python
百思买美国官网:Best Buy
2016/07/28 全球购物
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
美国折扣网站:jClub
2017/08/07 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
办公室内勤岗位职责范本
2013/12/09 职场文书
外语系毕业生自荐信范文
2013/12/16 职场文书
一年级语文教学反思
2014/02/13 职场文书
社区先进事迹材料
2014/05/19 职场文书
离婚协议书范文2015
2015/01/26 职场文书
聘任证明怎么写
2015/03/02 职场文书
离婚案件上诉状
2015/05/23 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书