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多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
php随机取mysql记录方法小结
Dec 27 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
php校验表单检测字段是否为空的方法
Mar 20 PHP
PHP微信开发之查询城市天气
Jun 23 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
php 实现银联商务H5支付的示例代码
Oct 12 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/06/02 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
获取Django项目的全部url方法详解
2017/10/26 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
pandas数据集的端到端处理
2019/02/18 Python
python下载库的步骤方法
2019/10/12 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
佳能法国商店:Canon法国
2019/02/14 全球购物
2014年设计师工作总结
2014/11/25 职场文书
优秀党员先进材料
2014/12/18 职场文书
社区活动总结
2015/02/04 职场文书
演讲比赛主持词
2015/06/29 职场文书
KTV员工管理制度
2015/08/06 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电