【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'] = '老范品牌';  //此處給一個默認值
	}
	//此處也可以增加其他字段的判定操作
}


?>



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM