不败君

前端萌新&初级后端攻城狮

Laravel 批量插入数据并去重

Laravel 批量插入数据并去重

2020-10-12 11:34:44

围观(3944)

最近两天把之前写的“遛遛狗” WWW.LL9.TOP 修复了一些 BUG(关于这个的文章:使用PHP Laravel 框架开发淘客站点

另外发现用户访问就直接实时请求阿里妈妈联盟的接口不太好,一来是数据难控制,有时候接口返回的数据某个参数是空的,二来是香港服务器访问阿里接口有点慢,所以改成定时请求接口将数据存起来,现在目前是使用 MySQL 进行存储,后面有时间再改成 MongoDb.


因为是使用 Laravel 框架开发的,所以直接使用了 insert 批量插入数据到数据库,如这样:

foreach($接口返回的数据 as $data) {
	$lst_save[] = [
        'product_item_id' => $row_product['item_id'],
        'url' => $row_product['coupon_share_url'],
        'price' => $row_product['zk_final_price'],
        'coupon_price' => $row_product['coupon_amount'],
        'use_coupon_price' => $row_product['zk_final_price'] - $row_product['coupon_amount'],
        'shop_title' => $row_product['shop_title'],
        'pict_url' => $row_product['pict_url'],
        'title' => $row_product['title'],
        'item_description' => $row_product['item_description'],
        'volume' => $row_product['volume'],
    ];
}

$model_product = new Product();
$model_product->insert($lst_save);

然后运行了一天发现太多重复的数据了。果断给 product_item_id 字段加上了唯一索引。

总所周知加了唯一索引可以使用 ignore 或 Replace 在插入数据的时候跳过重复数据,例如这样:

INSERT IGNORE INTO `products` (`product_item_id`, `url`) VALUES ('1111', 'url');

REPLACE INTO `products`(`product_item_id`, ...) VALUES (...);

就开始了查阅文档 / 使用搜索引擎 查找 Laravel 是否有类似的方法执行这样的 SQL, 如果没有的话可能就只能拼接 SQL了。


最后在官方文档找到了一个这样的方法 insertOrIgnore 官方示例:

DB::table('users')->insertOrIgnore([
    ['id' => 1, 'email' => 'taylor@example.com'],
    ['id' => 2, 'email' => 'dayle@example.com'],
]);

文档地址:https://laravel.com/docs/8.x/queries#inserts

注:该方法只有 Laravel 5.8 及以上版本才有。


最后将 insert 方法改成 insertOrIgnore 就行了:

foreach($接口返回的数据 as $data) {
	$lst_save[] = [
        'product_item_id' => $row_product['item_id'],
        'url' => $row_product['coupon_share_url'],
        'price' => $row_product['zk_final_price'],
        'coupon_price' => $row_product['coupon_amount'],
        'use_coupon_price' => $row_product['zk_final_price'] - $row_product['coupon_amount'],
        'shop_title' => $row_product['shop_title'],
        'pict_url' => $row_product['pict_url'],
        'title' => $row_product['title'],
        'item_description' => $row_product['item_description'],
        'volume' => $row_product['volume'],
    ];
}

$model_product = new Product();
$model_product->insertOrIgnore($lst_save);

本文地址 : bubaijun.com/page.php?id=211

版权声明 : 未经允许禁止转载!

上一篇文章: MySQL主从复制与读写分离

下一篇文章: Centos编译安装Redis

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语