TypechoJoeTheme

依然范儿特西

依然范儿特西

人生本没有地图,我们一路走,一路被辜负,一路点燃希望,一路寻找答案!
PHP

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

2021-06-04
/
0 评论
/
56 阅读
/
正在检测是否收录...
06/04


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


?>


朗读
赞(1)
评论 (0)
本篇文章评论功能已关闭