【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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2020-06-04 【PHP】字节跳动小程序 : 创建二维码图片接口的报错: bad access_token