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
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
PHP集成FCK的函数代码
Sep 27 PHP
php xml实例 留言本
Mar 20 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
php缓存技术详细总结
Aug 07 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
如何在PHP中使用数组
Jun 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
微信自定义分享php代码分析
2016/11/24 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
javascript常用的方法整理
2015/08/20 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
求职者怎样写自荐信
2014/04/13 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
储备店长岗位职责
2015/04/14 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
Python使用pyecharts控件绘制图表
2022/06/05 Python