对 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 ![]() 先单独把获取的数据和对比数据拉下来 然后进行对比,再批量进行删除或者更新就行了 你这样多次循环对数据库压力非常大,真要循环的话用 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 ![]() 可以这样试试,我写个伪代码你参考一下。 $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 ![]() thinkphp 中的 model 有一个 Model->saveAll($dataSet, $replace = true) Db 我不知道有没有 对应的 SQL 是 REPLACE INTO |
![]() | 15 FlexGap 2019-12-01 22:50:08 +08:00 为啥看不到图呢。。。 |