zoukankan      html  css  js  c++  java
  • 【PHP】 如何避免在foreach 里查询数据库

    直接上代码

    
    
    <?php
    
    ### 如何避免在foreach 里查询数据库
    
    /**
    *  场景: 
    * 		商品表: goods
    *				goods_id     商品ID
    *				goods_name   商品名称
    *				brand_id     品牌id
    *		品牌表:  brand
    *				brand_id
    *				brand_name
    **/
    
    //此时我们已经得到一组数据,想到拿到品牌名称(此处为了演示。不考虑链表查询的情况下)
    $data_list = [
    	[
    		'id'=>1,
    		'goods_id'=>1,
    		'goods_name'=>'老范测试',
    		'brand_id'=>1,
    		//或许会拿更多字段,比如 产地,规格,等等
    	],
    	//-----或许更多数据
    ];
    
    
    
    
    /**
    * 错误示例
    * 在业务量大的情况下。此处会多次读取数据库。增加数据库压力
    */
    foreach ($data_list as $key => $value) {
    	$brand_mes = Db::table('brand')->field('name')->where(['id'=>$value['brand_id']])->find()
    	if(!empty($brand_mes)){
    		$data_list[$key]['brand_name'] = $brand_mes['name'];
    	}else{
    		$data_list[$key]['brand_name'] = '老范品牌';  //此处给一个默认值
    	}
    }
    
    
    
    /**
    * 建议使用以下用法,数据库查询一次,把其他操作放在内存里,以减少数据库IO
    *
    */
    $brand_id_str = array_column($data_list,'brand_id');
    //查询当前品牌ID包含所有品牌信息
    $brand_list = Db::table('brand')->field('id,name')->whereIn('id',$brand_id_str)->select()
    $res_brand_array = [];
    if(!empty($brand_list)){
    	foreach ($brand_list as $k => $v) {
    		// brand_id => brand_name 以这种形式存储,便于读取
    		$res_brand_array[$v['id']]=>$v['name'];
    	}
    }
    //最后组装数据
    foreach ($data_list as $key => $value) {
    	if(isset($res_brand_array[$value['brand_id']]) && !empty($res_brand_array[$value['brand_id']])){
    		$data_list[$key]['brand_name'] =$res_brand_array[$value['brand_id'];
    	}else{
    		$data_list[$key]['brand_name'] = '老范品牌';  //此处给一个默认值
    	}
    	//此处也可以增加其他字段的判定操作
    }
    
    
    ?>
    
    
    
    欢迎做技术的朋友一起沟通交流!伸手党请绕道, 代码改变世界QQ群:453011886
  • 相关阅读:
    xcode Git
    The OAuth 2.0 Authorization Framework
    Apache Commons 工具集介绍
    遍历map
    ClassLoader 提供了两个方法用于从装载的类路径中取得资源:
    转:mysql 索引
    StringBuilder与StringBuffer
    第四次作业
    Java Class 与 Object
    软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别
  • 原文地址:https://www.cnblogs.com/richerdyoung/p/14848235.html
Copyright © 2011-2022 走看看