对 PHP 感兴趣一直断断续续的自学中,这两天写一个函数的时候遇到了点问题,想请教一下。用的框架是 thinkPHP5.
https://i.imgur.com/NU0YJJw.png
这是目前写了的代码,其中已经能够通过获取的数据对数据库进行新增和修改,但是不懂该如何比对新获取的数据与现有数据库中的数据,从而删除数据库中对比新获取的数据中已经没有了的数据。
1
yamamotoahua 2019-10-29 00:20:16 +08:00
可以使用 array_merge($originData, $newData)来合并原数据和新数据,会覆盖相同 key 的元素。
建议尽量不要在循环里面发请求或者操作数据库。 |
2
agdhole 2019-10-29 00:40:46 +08:00 1
先单独把获取的数据和对比数据拉下来
然后进行对比,再批量进行删除或者更新就行了 你这样多次循环对数据库压力非常大,真要循环的话用 yield 来延迟加载或者放队列 |
3
yamamotoahua 2019-10-29 00:44:15 +08:00
你这个代码第一次 for 循环我没看懂你具体业务所以不好给建议,
第二次其实可以这样优化。 用 array_column 方法获取到$products 里 pid 的集合,再根据这个 pid 集合找到数据库中需要更新的记录就可以一次 sql 查询拿到要更新的数据集。 |
4
yamamotoahua 2019-10-29 00:54:45 +08:00
不是兄弟你 for 外面的$res 是不返回$products 的吗?为什么还要再发个一样的请求分页返回呢?
|
5
yamamotoahua 2019-10-29 01:14:51 +08:00 1
可以这样试试,我写个伪代码你参考一下。
$productIds = array_column($products, 'id'); //拿到已存在的数据 ID 集。 $existedProducts = DB::findIn('pid', $productIds); //我平时用 laravel 和 symfony,不懂 tp5 的 where in 语法。 foreach($products as $key => $product) { $appProduct = array('pid' => 0, 'status' => '', 'timestamp' => '' .....) //初始化一个要插入到数据库的数组。 $appProduct = array_merge($appProduct, $product); //覆盖已有的数据。 if (in_array($appProduct['pid'], $existedProducts)) {更新} else {插入} //这里的更新和插入建议使用事件、定时任务、队列之类的,不然会卡死进程 } |
6
nvkou 2019-10-29 01:23:26 +08:00 via Android
一直以为这些是 orm 的活
|
7
way2create 2019-10-29 08:45:39 +08:00
这 DB table 乍一看还以为 laravel
|
8
www6688w 2019-10-29 09:16:09 +08:00
为啥你这图我看不了 (*゜ー゜*)
|
9
augustpluscn 2019-10-29 09:20:09 +08:00
获取列表。批量删除已经存在的资料
将新资料整理成 array 格式,一次插入。 避免循环中的数据库操作 |
10
he583899772 2019-10-29 09:52:32 +08:00
看到循环查表就脑壳痛
|
11
zhensjoke 2019-10-29 10:15:02 +08:00
看文字说明来说的话,为啥不直接 update...
|
13
elarity 2019-10-29 10:24:24 +08:00
@he583899772 一般遇到这种场景有什么好的解决方法吗?
|
14
skyrem 2019-10-29 13:03:11 +08:00 1
thinkphp 中的 model 有一个 Model->saveAll($dataSet, $replace = true)
Db 我不知道有没有 对应的 SQL 是 REPLACE INTO |
15
FlexGap 2019-12-01 22:50:08 +08:00
为啥看不到图呢。。。
|