PHP 基础增删改查中遇到的问题

2019-10-28 23:41:59 +08:00
 indo

对 PHP 感兴趣一直断断续续的自学中,这两天写一个函数的时候遇到了点问题,想请教一下。用的框架是 thinkPHP5.

https://i.imgur.com/NU0YJJw.png

这是目前写了的代码,其中已经能够通过获取的数据对数据库进行新增和修改,但是不懂该如何比对新获取的数据与现有数据库中的数据,从而删除数据库中对比新获取的数据中已经没有了的数据。

4183 次点击
所在节点    PHP
15 条回复
yamamotoahua
2019-10-29 00:20:16 +08:00
可以使用 array_merge($originData, $newData)来合并原数据和新数据,会覆盖相同 key 的元素。
建议尽量不要在循环里面发请求或者操作数据库。
agdhole
2019-10-29 00:40:46 +08:00
先单独把获取的数据和对比数据拉下来
然后进行对比,再批量进行删除或者更新就行了
你这样多次循环对数据库压力非常大,真要循环的话用 yield 来延迟加载或者放队列
yamamotoahua
2019-10-29 00:44:15 +08:00
你这个代码第一次 for 循环我没看懂你具体业务所以不好给建议,
第二次其实可以这样优化。
用 array_column 方法获取到$products 里 pid 的集合,再根据这个 pid 集合找到数据库中需要更新的记录就可以一次 sql 查询拿到要更新的数据集。
yamamotoahua
2019-10-29 00:54:45 +08:00
不是兄弟你 for 外面的$res 是不返回$products 的吗?为什么还要再发个一样的请求分页返回呢?
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 {插入} //这里的更新和插入建议使用事件、定时任务、队列之类的,不然会卡死进程
}
nvkou
2019-10-29 01:23:26 +08:00
一直以为这些是 orm 的活
way2create
2019-10-29 08:45:39 +08:00
这 DB table 乍一看还以为 laravel
www6688w
2019-10-29 09:16:09 +08:00
为啥你这图我看不了 (*゜ー゜*)
augustpluscn
2019-10-29 09:20:09 +08:00
获取列表。批量删除已经存在的资料
将新资料整理成 array 格式,一次插入。
避免循环中的数据库操作
he583899772
2019-10-29 09:52:32 +08:00
看到循环查表就脑壳痛
zhensjoke
2019-10-29 10:15:02 +08:00
看文字说明来说的话,为啥不直接 update...
sep9999
2019-10-29 10:15:46 +08:00
@www6688w 要翻墙是最骚的
elarity
2019-10-29 10:24:24 +08:00
@he583899772 一般遇到这种场景有什么好的解决方法吗?
skyrem
2019-10-29 13:03:11 +08:00
thinkphp 中的 model 有一个 Model->saveAll($dataSet, $replace = true)
Db 我不知道有没有
对应的 SQL 是 REPLACE INTO
FlexGap
2019-12-01 22:50:08 +08:00
为啥看不到图呢。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/613836

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX