• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【PHP】如何避免在foreach里查询数据库

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

直接上代码



<?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'] = '老范品牌';  //此处给一个默认值
	}
	//此处也可以增加其他字段的判定操作
}


?>



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php编译安装报错:make:***[sapi/cli/php]Error1解决办法发布时间:2022-07-10
下一篇:
PHP-生成二维码(qr-code)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap