【问题标题】:Check for duplication before insert data into DB table在将数据插入数据库表之前检查重复项
【发布时间】:2019-08-22 12:14:37
【问题描述】:

我在检查 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++;
}

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

【问题讨论】:

  • $urls 是一个数组吗?
  • 是的,它是一个数组。

标签: php laravel


【解决方案1】:

$urls 似乎是一个数组。所以,让我们稍微修改一下代码。

$i = 0;
$database = [];

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

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

    $i++;
}

重要的是第一个条件,它表示如果没有一个包含在$url中的url的计划,它将进入条件。因为,您想避免重复条目。

【讨论】:

    【解决方案2】:

    抓取工具和爬虫是非常消耗资源的应用程序,因此我更愿意避免在插入之前检查相同 URL 的额外数据库选择交互。

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

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

    您可以使用像MD5 算法这样的快速算法来散列网址,该算法采用

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

    您也可以使用 this option 进行散列

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

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

    【讨论】:

      【解决方案3】:

      如果为空则可以使用

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

      否则你可以使用请求验证

      'url' => 'unique:plan'
      

      【讨论】:

      • 实际上,正在尝试检查 url。因为接下来如果我抓取数据。我不想将相同的 url 数据插入数据库。为了防止这种情况,要检查 url 是否已经在 db 中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2014-10-04
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多