V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
indo
V2EX  ›  PHP

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

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

    对 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   ·   实用小工具   ·   4042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:25 · PVG 13:25 · LAX 21:25 · JFK 00:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.