首页 > 解决方案 > 在将数据插入数据库表之前检查重复

问题描述

我在检查 Laravel 中的数据库时遇到了一些麻烦。我已经抓取数据并将其插入数据库。但在插入进度之前。我想检查是否有任何相同的数据(例如相同的 url)。如果有相同的网址。然后避免插入该数据。

到目前为止我所做的就在下面。

$i = 0;
$database = [];
foreach($placeUrls as $k => $urls) {
    $database = [
        "place_id" => $k,
        "website" => "a-site",
        "place_name" => $names[$k],
        "url" => $urls,
    ];

    if ($plan = Plan::where("url", "=", $urls)->first()) {
        if ($plan->url != $database["url"]) {
            $this->line("plan inserted");
            Plan::insertGetId($database);
        }
    }

    $i++;
}

但检查部分不正确。我该如何解决?

标签: phplaravel

解决方案


Scrapers 和 crawler 是非常消耗资源的应用程序,因此我更愿意避免在插入之前检查相同 URL 的额外 DB 选择交互。

在我的简单爬虫中,我在URLs包含 URL哈希的表中添加了一个列,并在该列上添加了UNIQUE索引。

ALTER TABLE urls ADD COLUMN url_hash char(32) NOT NULL UNIQUE

你可以用一些快速的算法来散列 url,比如MD5算法

$hash = md5($method . $domain . $url);

您也可以使用此选项进行散列

这将允许您插入您收集的每个 URL,而无需先从数据库中选择它,并让数据库在较低级别处理唯一性问题。

警告:以后不要更改创建哈希的方式,否则您将以许多重复的 url 结尾


推荐阅读