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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
php实现购物车功能(下)
Jan 05 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 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投票程序源码
2007/03/11 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
Three.js加载外部模型的教程详解
2017/11/10 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
Python实例之wxpython中Frame使用方法
2014/06/09 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python查看模块,对象的函数方法
2018/10/16 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
MySQL面试题
2014/01/12 面试题
学生档案自我鉴定
2013/10/07 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
大学生毕业求职信
2014/06/12 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python