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程序
Oct 09 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
phpstrom使用xdebug配置方法
Dec 17 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
php字符串分割函数用法实例
Mar 17 PHP
WordPress网站性能优化指南
Nov 18 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
CI框架常用函数封装实例
Nov 21 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
php 判断页面或图片是否经过gzip压缩的方法
Apr 05 PHP
PHP配置ZendOpcache插件加速
Feb 14 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
php封装的验证码类分享
2017/02/26 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
python数据结构之链表详解
2017/09/12 Python
python计算日期之间的放假日期
2018/06/05 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
使用python实现学生信息管理系统
2021/02/25 Python
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
一套C++笔试题面试题
2012/06/06 面试题
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
Python中22个万用公式的小结
2021/07/21 Python