功能要求: 企业列表(展示企业的基本信息,这里只获取了名称、logo、和服务类型), 服务类型说明: 服务类型一共3级,1、2级是必填的,3级是非必填,如果填的话最多3个,  服务类型1、2、3保存在一张表, pid作为关联字段(默认为0)

企业列表数据结构   服务类型1、2级都是唯一的所有查询企业数据时就关联获取到了
 array:4 [
0 => array:6 [
"id" => 1
"company_name" => "公司名称1"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 101
"name" => "金融服务"
]
"service_type2" => array:2 [
"id" => 102
"name" => "理财"
]
"service_type3" => "826,827,828"
]
1 => array:6 [
"id" => 2
"company_name" => "公司名称2"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => 0
"service_type2" => 0
"service_type3" => 0
]
2 => array:6 [
"id" => 3
"company_name" => "公司名称3"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 13
"name" => "日用百货"
]
"service_type2" => array:2 [
"id" => 15
"name" => "文具"
]
"service_type3" => "291,292,295"
]
3 => array:6 [
"id" => 4
"company_name" => "公司名称4"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 48
"name" => "信息服务"
]
"service_type2" => array:2 [
"id" => 50
"name" => "操作系统"
]
"service_type3" => "523,524,526"
]
]

问题就是第三级是用逗号隔开保留的数据,关联查不好查,所以需要单独的处理第三级的数据,怎么弄?

 //我这里用的是laravel框架,数据库的交互都是封装好的  下面是根据封装的方法处理的查询数据
foreach( $data as $key => &$vo ){
//首先将第三级的数据整理成一个一维数组
$service_type3 = explode( ',' , $vo['service_type3'] );
$arr_option3['whereIn'] = ['id' => $service_type3]; //whereIn查询指定的数据
$arr_option3['field'] = ['id','name']; //只获取指定的字段信息
$vo['service_type3'] = CompanyServiceTypeRepository::getAll( $arr_option3 ); //查询数据
}

这是执行上面代码数据的结果

 array:4 [
0 => array:6 [
"id" => 1
"company_name" => "公司名称1"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 101
"name" => "金融服务"
]
"service_type2" => array:2 [
"id" => 102
"name" => "理财"
]
"service_type3" => array:3 [
0 => "外汇"
1 => "基金"
2 => "股票"
]
]
1 => array:6 [
"id" => 2
"company_name" => "公司名称2"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => 0
"service_type2" => 0
"service_type3" => []
]
2 => array:6 [
"id" => 3
"company_name" => "公司名称3"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 13
"name" => "日用百货"
]
"service_type2" => array:2 [
"id" => 15
"name" => "文具"
]
"service_type3" => array:3 [
0 => "桌面用品"
1 => "办公本薄"
2 => "文件装整"
]
]
3 => & array:6 [
"id" => 4
"company_name" => "公司名称4"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 48
"name" => "信息服务"
]
"service_type2" => array:2 [
"id" => 50
"name" => "操作系统"
]
"service_type3" => array:3 [
0 => "虚拟机系统"
1 => "Unix/Linux"
2 => "Windows/dos"
]
]
]

数据结果正确?  是的正确的  也是我想要的数据机构。  但是当时没有考虑明白,  现在只有4条数据,那么就要循环4次去获取第三级分类名称,要是数据是10条?20条? all?  那不就给数据库增加压力了吗,而且如果有好几家公司的第三级数据相同的话,是不是重复执行了相同的sql语句? 这一层面上是不是又造成了资源浪费。

所有称同事没有注意到我个代码 , 立马 马不停蹄的赶紧改掉,怎么改?   先提供一个思路吧在贴代码

我们一点要避免循环里面套sql查询, 这个你会有意想不到的结果。所有我的思路是将所有企业的第三级数据整理成一个数组,统一去查出所有的第三级名称,在循环数组将对应的名称保存到对应的企业下保存起来。

下面我来贴出代码,虽然代码量会比上面foreach查询的量多一些,但是效率和资源浪费上面提升了很多。

使用到的相关php函数,基本上都是常用函数(具体函数说明请自行百度): array_column() 、implode()、explode()、array_values()、asort()、array_unique()、array_shift()

 $service_type3 = array_column( $data , 'service_type3');  //这里会得到一个一维数组,元素是上面$data数据的service_type3字段数据
$service_type3 = implode( ',' , $service_type3 ); //将数据切割成字符串 得到的结果是 "826,827,828,0,291,292,295,523,524,526"
$service_type3 = explode(',', $service_type3 ); //再次将上面的字符串切割成数组(很有必要) 得到的又是一个一维数组,和第一步的数据是不一样的
$service_type3 = array_unique( $service_type3 ); //数组去重
//第一种方法 尽可能的使用php定义的函数
asort( $service_type3 ); //将数组内的元素由低到高进行一下排序(也很有必要,因为又可以会有0在里面,由于上面去重了一次,所有经过排序后如果有0元素的话会在第一位)
$service_type3 = array_values( $service_type3 ); //重新定义数组的索引
if( $service_type3[0] == 0 ){ //如果数组的第一个元素是0
array_shift( $service_type3 ); //删除第一个元素
}
//第二种方法
// foreach ( $service_type3 as $key => $vo ){
// if( $vo == 0 ){
// unset( $service_type3[$key] );
// }
// }

最终得到的数据

 array:8 [
0 => "826"
1 => "827"
2 => "828"
4 => "291"
5 => "292"
6 => "295"
7 => "523"
8 => "524"
]

接下来我们在查询第三级的类型名称   这里就只用查询一次数据库就能查出所有的第三级类型名称数据了

 $arr_option3['whereIn'] = ['id' => $service_type3];     //所有3级的id
$arr_option3['field'] = ['id','name'];
$arr_service_type3 = CompanyServiceTypeRepository::getAll( $arr_option3 ); //获取第三级服务类型名称
$arr_service_type3 = array_column( $arr_service_type3 ,'name' ,'id'); //将数据整理成id为键 name为值的一维键值对数组

得打的结果

 array:8 [
828 => "外汇"
827 => "基金"
826 => "股票"
524 => "Unix/Linux"
523 => "Windows/dos"
295 => "桌面用品"
292 => "办公本薄"
291 => "文件装整"
]

最后将数据保存到对应的企业列表中, 可以对比一下与上面循环里面套sql得到的结果是否一样

 foreach ( $data as $key => &$vo ){
if( $vo['service_type3'] != 0 ){
$service_type3 = explode( ',' , $vo['service_type3']); //将字符串切割成数组
$vo['service_type3'] = [];
foreach ( $service_type3 as $k => $v ){
$vo['service_type3'][] = $arr_service_type3[$v];
}
}else{
$vo['service_type3'] = [];
}
11 }

最终得到的结果

 array:4 [
0 => array:6 [
"id" => 1
"company_name" => "公司名称1"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 101
"name" => "金融服务"
]
"service_type2" => array:2 [
"id" => 102
"name" => "理财"
]
"service_type3" => array:3 [
0 => "股票"
1 => "基金"
2 => "外汇"
]
]
1 => array:6 [
"id" => 2
"company_name" => "公司名称2"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => 0
"service_type2" => 0
"service_type3" => []
]
2 => array:6 [
"id" => 3
"company_name" => "公司名称3"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 13
"name" => "日用百货"
]
"service_type2" => array:2 [
"id" => 15
"name" => "文具"
]
"service_type3" => array:3 [
0 => "文件装整"
1 => "办公本薄"
2 => "桌面用品"
]
]
3 => & array:6 [
"id" => 4
"company_name" => "公司名称4"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 48
"name" => "信息服务"
]
"service_type2" => array:2 [
"id" => 50
"name" => "操作系统"
]
"service_type3" => array:3 [
0 => "Windows/dos"
1 => "Unix/Linux"
2 => "Unix/Linux"
]
]
]

还是那句话  尽量不要在循环里面套sql语句, 我这里应该第三级的数据不是固定的可以无限的添加,所以才整理成数组用whereIn查询了一次, 但是如果服务类型个数有限(100个以内的话), 直接全部多出来,在出来数组(这里我就不仔细说了 懂的自然懂)

说白了就是php处理数组、数据的能了肯定比你查询数据库厉害

php 循环里面套sql怎么解决的更多相关文章

  1. handlebars,each循环里面套each循环

    handlebars可以用each自动进行循环,下面介绍一下each循环里面套循环来着. html代码 !DOCTYPE html> <html> <head> < ...

  2. uni-app如何解决在for循环里调用异步请求获取数据顺序混乱问题?

    总结/朱季谦 先前有一次做uni-app的js接口对接时,遇到过这样的情况,在for循环里,调用一个异步请求时,返回来的值顺序是乱的,因此,在以下的代码里,push到数组里的值,每次的顺序可能都是不一 ...

  3. 关于hasNextInt判断后无限循环输出else项的解决办法

    话不多说,上来就是干! import java.util.Scanner; public class Test_hasNextInt { /** * @param args */ public sta ...

  4. sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理

    1. 安装 Microsoft SQL Server Compact 4.0  https://www.microsoft.com/zh-cn/download/confirmation.aspx?i ...

  5. 【vue】vue使用Element组件时v-for循环里的表单项验证方法

    转载至:https://www.jb51.net/article/142750.htm标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中 ...

  6. js循环里进行回调,引用循环里的变量,发现只是最后值的问题

    做项目的时候,栽在一个小地方,是这样的 我有很多个坐标点,我想把这些坐标点都绑定一个事件,当点击了这个坐标点之后,发送一个ajax 请求,将坐标点的id 发出去,等待显示返回的数据 但是实际当中,无论 ...

  7. Java问题记录——循环里的二次判断与状态更新

    Java问题记录——循环里的二次判断与状态更新 摘要:本文主要记录了在循环操作时可能出现的问题. 问题重现 在使用循环结构时,如果使用了定时任务,或者代码会多次调用循环结构,可能会导致有些对象会被循环 ...

  8. SQL Server解决孤立用户浅析

    孤立用户概念        所谓孤立用户即指在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例. 这样的用户被称为此服务器实例上的数据库的"孤立用 ...

  9. [经验] 新版SkyIAR、Easy Image X在有些PE里不能运行的解决办法

    [经验] 新版SkyIAR.Easy Image X在有些PE里不能运行的解决办法 xxwl2008 发表于 2013-1-26 11:58:38 https://www.itsk.com/threa ...

随机推荐

  1. 利用python进行数据分析PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:hi2j 内容简介 [名人推荐] "科学计算和数据分析社区已经等待这本书很多年了:大量具体的实践建议,以及大量综合应用方法.本书在未来几年里肯定会成为Python领域中技术计 ...

  2. LSTM理解

    简介 LSTM(Long short-term memory,长短期记忆)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失问题.以下先从RNN介绍. 简说RNN RNN(Recurrent ...

  3. 老板让我从上千个Excel中筛选数据,利用Python分分钟解决!

    大家好,又到了Python办公自动化系列. 今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大! 很多人学习python,不知道从何学起.很多人学习 ...

  4. 冷饭新炒:理解Snowflake算法的实现原理

    前提 Snowflake(雪花)是Twitter开源的高性能ID生成算法(服务). 上图是Snowflake的Github仓库,master分支中的REAEMDE文件中提示:初始版本于2010年发布, ...

  5. 【LeetCode/LintCode 题解】约瑟夫问题 · Joseph Problem

    n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题.现在给定n和k,你 ...

  6. JavaScript Object的defineProperty / getOwnPropertyDescriptor

    getOwnPropertyDescriptor and defineProperty function def (obj, key, val, enumerable) { Object.define ...

  7. Android 开发学习进程0.15 adb cardview framelayout 控件设置状态获取焦点

    Android设备调试桥 即adb 使用adb进行无线调试的一些常用命令 adb tcpip 5555 设置调试端口为5555 防止冲突 adb shell ifconfig wlan0 查询局域网中 ...

  8. CSS动画实例:升空的气球

    1.制作一个气球 设页面中有<div class="balloon"></div>,为. balloon设置样式规则如下: .balloon { heigh ...

  9. Android 在代码中修改TextView的DrawableRight等方向上的图片

    在XML文件中可以对TextView进行设置: android:drawableTop="@drawable/XXX" android:drawableBottom="@ ...

  10. Python-Opencv 图像处理基本操作

    Python-Opencv 图像处理基本操作 1.图像读取 使用cv2.imread(filepath,flags)读入图像 filepath: 读入图像完整路径(绝对路径,相对路径) flags: ...