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 相关文章推荐
通过html表格发电子邮件
Oct 09 PHP
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
php相当简单的分页类
Oct 02 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
Jan 09 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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
jquery 笔记 事件
2011/11/02 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
2018/09/16 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
NodeJS实现同步的方法
2019/03/02 NodeJs
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
Python 列表(List)操作方法详解
2014/03/11 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python正则表达式之对号入座篇
2018/07/24 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python模块常用用法实例详解
2019/10/17 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
Python datetime模块的使用示例
2021/02/02 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
企业管理专业个人求职信范文
2013/09/24 职场文书
小学教师的自我评价范例
2013/10/31 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
2014政务公开实施方案
2014/02/19 职场文书
会计岗位说明书
2014/07/29 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
2015选调生工作总结
2015/07/24 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
Python源码解析之List
2021/05/21 Python
详解TypeScript的基础类型
2022/02/18 Javascript