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 相关文章推荐
利用js调用后台php进行数据处理原码
Oct 09 PHP
php在线生成ico文件的代码
Oct 09 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
May 14 PHP
PHP读取PDF内容配合Xpdf的使用
Nov 24 PHP
百度站点地图(百度sitemap)生成方法分享
Jan 09 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
浅谈php提交form表单
Jul 01 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
PHP+Oracle本地开发环境搭建方法详解
Apr 01 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从数据库查询结果生成树形列表的方法
2015/04/17 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
国际贸易个人求职信范文
2014/01/04 职场文书
校本教研工作制度
2014/01/22 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
银行催款通知书
2015/04/17 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android