Php 在将数据插入数据库表之前检查重复

Php 在将数据插入数据库表之前检查重复,php,laravel,Php,Laravel,我在检查Laravel中的DB时遇到了一些麻烦。我已经抓取数据并将其插入数据库。但在插入进度之前。我想检查是否有任何相同的数据(例如相同的url)。如果有相同的url。然后避免插入该数据 我到目前为止所做的事情就在下面 $i = 0; $database = []; foreach($placeUrls as $k => $urls) { $database = [ "place_id" => $k, "website" => "a-si

我在检查Laravel中的DB时遇到了一些麻烦。我已经抓取数据并将其插入数据库。但在插入进度之前。我想检查是否有任何相同的数据(例如相同的url)。如果有相同的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++;
}
但检查部分不正确。我怎样才能修好它

如果为空,则可以使用

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

或者您可以使用请求验证

'url' => 'unique:plan'
如果为空,则可以使用

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

或者您可以使用请求验证

'url' => 'unique:plan'

scraper和crawler是非常消耗资源的应用程序,所以我宁愿避免额外的DB-select交互,在插入相同的URL之前检查它

在我的简单爬虫程序中,我在
URL
表中添加了一列,该列包含URL散列,并在该列上添加了
UNIQUE
索引

ALTER TABLE urls ADD COLUMN url_hash char(32) NOT NULL UNIQUE
您可以使用类似于
MD5
的快速算法来散列url,该算法采用

$hash = md5($method . $domain . $url);
你也可以用hash

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


警告:以后不要更改创建散列的方式,否则将导致许多重复URL的出现。刮取器和爬网器是非常消耗资源的应用程序,因此我宁愿避免在插入相同URL之前检查相同URL的额外DB select交互

在我的简单爬虫程序中,我在
URL
表中添加了一列,该列包含URL散列,并在该列上添加了
UNIQUE
索引

ALTER TABLE urls ADD COLUMN url_hash char(32) NOT NULL UNIQUE
您可以使用类似于
MD5
的快速算法来散列url,该算法采用

$hash = md5($method . $domain . $url);
你也可以用hash

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


警告:以后不要更改创建哈希的方式,否则将以许多重复的URL结尾。看起来
$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::whereIn("url", $urls)->first())
    { // ^              ^^^^^^^^^^^^^^^^^^^^^
        if ($plan->url != $database["url"])
        {
            $this->line("plan inserted");
            Plan::insertGetId($database);
        }
    }

    $i++;
}

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

似乎
$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::whereIn("url", $urls)->first())
    { // ^              ^^^^^^^^^^^^^^^^^^^^^
        if ($plan->url != $database["url"])
        {
            $this->line("plan inserted");
            Plan::insertGetId($database);
        }
    }

    $i++;
}

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

$url
数组吗?是的,它是数组。
$url
是数组吗?是的,它是数组。实际上,正在尝试检查URL。因为下一步如果我抓取数据。我不想在数据库中插入相同url的数据。为了防止出现这种情况,请检查url是否已在数据库中。实际上,正在尝试检查url。因为下一步如果我抓取数据。我不想在数据库中插入相同url的数据。为了防止出现这种情况,需要检查url是否已经在数据库中。