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
php empty函数 使用说明
Aug 10 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
生成随机字符串和验证码的类的PHP实例
Dec 24 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
学习php中的正则表达式
Aug 17 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
php intval函数用法总结
Apr 14 PHP
phpquery中文手册
Mar 18 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实现简单注册登录系统
2020/12/28 PHP
破解Session cookie的方法
2006/07/28 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
python中的错误处理
2016/04/10 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
python实现TCP文件传输
2020/03/20 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
python 动态绘制爱心的示例
2020/09/27 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
python 获取计算机的网卡信息
2021/02/18 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
PHP开发的一般流程
2013/08/13 面试题
酒后驾驶检讨书
2014/01/27 职场文书
作弊检讨书1000字
2014/02/01 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书