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

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

  •  
  •   indo · 41 天前 · 1801 次点击
    这是一个创建于 41 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    15 回复  |  直到 2019-12-01 22:50:08 +08:00
        1
    yamamotoahua   41 天前
    可以使用 array_merge($originData, $newData)来合并原数据和新数据,会覆盖相同 key 的元素。
    建议尽量不要在循环里面发请求或者操作数据库。
        2
    agdhole   41 天前   ♥ 1
    先单独把获取的数据和对比数据拉下来
    然后进行对比,再批量进行删除或者更新就行了
    你这样多次循环对数据库压力非常大,真要循环的话用 yield 来延迟加载或者放队列
        3
    yamamotoahua   41 天前
    你这个代码第一次 for 循环我没看懂你具体业务所以不好给建议,
    第二次其实可以这样优化。
    用 array_column 方法获取到$products 里 pid 的集合,再根据这个 pid 集合找到数据库中需要更新的记录就可以一次 sql 查询拿到要更新的数据集。
        4
    yamamotoahua   41 天前
    不是兄弟你 for 外面的$res 是不返回$products 的吗?为什么还要再发个一样的请求分页返回呢?
        5
    yamamotoahua   41 天前   ♥ 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   41 天前 via Android
    一直以为这些是 orm 的活
        7
    way2create   41 天前
    这 DB table 乍一看还以为 laravel
        8
    www6688w   41 天前
    为啥你这图我看不了 (*゜ー゜*)
        9
    augustpluscn   41 天前
    获取列表。批量删除已经存在的资料
    将新资料整理成 array 格式,一次插入。
    避免循环中的数据库操作
        10
    he583899772   41 天前
    看到循环查表就脑壳痛
        11
    zhensjoke   41 天前
    看文字说明来说的话,为啥不直接 update...
        12
    sep9999   41 天前
    @www6688w 要翻墙是最骚的
        13
    elarity   41 天前
    @he583899772 一般遇到这种场景有什么好的解决方法吗?
        14
    skyrem   41 天前   ♥ 1
    thinkphp 中的 model 有一个 Model->saveAll($dataSet, $replace = true)
    Db 我不知道有没有
    对应的 SQL 是 REPLACE INTO
        15
    FlexGap   7 天前
    为啥看不到图呢。。。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3601 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 33ms · UTC 05:15 · PVG 13:15 · LAX 21:15 · JFK 00:15
    ♥ Do have faith in what you're doing.