PHP 基础增删改查中遇到的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
indo
V2EX    PHP

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

  •  
  •   indo 2019-10-28 23:41:59 +08:00 4715 次点击
    这是一个创建于 2176 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    15 条回复    2019-12-01 22:50:08 +08:00
    yamamotoahua
        1
    yamamotoahua  
       2019-10-29 00:20:16 +08:00
    可以使用 array_merge($originData, $newData)来合并原数据和新数据,会覆盖相同 key 的元素。
    建议尽量不要在循环里面发请求或者操作数据库。
    agdhole
        2
    agdhole  
       2019-10-29 00:40:46 +08:00   1
    先单独把获取的数据和对比数据拉下来
    然后进行对比,再批量进行删除或者更新就行了
    你这样多次循环对数据库压力非常大,真要循环的话用 yield 来延迟加载或者放队列
    yamamotoahua
        3
    yamamotoahua  
       2019-10-29 00:44:15 +08:00
    你这个代码第一次 for 循环我没看懂你具体业务所以不好给建议,
    第二次其实可以这样优化。
    用 array_column 方法获取到$products 里 pid 的集合,再根据这个 pid 集合找到数据库中需要更新的记录就可以一次 sql 查询拿到要更新的数据集。
    yamamotoahua
        4
    yamamotoahua  
       2019-10-29 00:54:45 +08:00
    不是兄弟你 for 外面的$res 是不返回$products 的吗?为什么还要再发个一样的请求分页返回呢?
    yamamotoahua
        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 {插入} //这里的更新和插入建议使用事件、定时任务、队列之类的,不然会卡死进程
    }
    nvkou
        6
    nvkou  
       2019-10-29 01:23:26 +08:00 via Android
    一直以为这些是 orm 的活
    way2create
        7
    way2create  
       2019-10-29 08:45:39 +08:00
    这 DB table 乍一看还以为 laravel
    www6688w
        8
    www6688w  
       2019-10-29 09:16:09 +08:00
    为啥你这图我看不了 (**)
    augustpluscn
        9
    augustpluscn  
       2019-10-29 09:20:09 +08:00
    获取列表。批量删除已经存在的资料
    将新资料整理成 array 格式,一次插入。
    避免循环中的数据库操作
    he583899772
        10
    he583899772  
       2019-10-29 09:52:32 +08:00
    看到循环查表就脑壳痛
    zhensjoke
        11
    zhensjoke  
       2019-10-29 10:15:02 +08:00
    看文字说明来说的话,为啥不直接 update...
    sep9999
        12
    sep9999  
       2019-10-29 10:15:46 +08:00
    @www6688w 要翻墙是最骚的
    elarity
        13
    elarity  
       2019-10-29 10:24:24 +08:00
    @he583899772 一般遇到这种场景有什么好的解决方法吗?
    skyrem
        14
    skyrem  
       2019-10-29 13:03:11 +08:00   1
    thinkphp 中的 model 有一个 Model->saveAll($dataSet, $replace = true)
    Db 我不知道有没有
    对应的 SQL 是 REPLACE INTO
    FlexGap
        15
    FlexGap  
       2019-12-01 22:50:08 +08:00
    为啥看不到图呢。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2812 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:21 PVG 08:21 LAX 17:21 JFK 20:21
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86