2

我的应用程序中有一个名为“categories”的表,它对“category_name”具有唯一性约束,我想在“categories”中插入多行。

不好的解决方案:

foreach($categories as $category) {
   Category::firstOrCreate(array('category_name' => $category['name']));
}

这可能是一个解决方案,但这不是一个好的解决方案。问题是当有数百或数千条记录时,这将对数据库进行大量查询。这不好。

比较好的解决方案

foreach($categories as $category){
    $cats[] = array('category_name' => $category['name']);
}
Category::insert($cats);

但是当我尝试插入重复的“category_name”时,它会引发异常并且没有插入任何类别名称。

我知道我们可以使用INSERT IGNORE,但我正在寻找一些内置的 laravel 解决方案。

4

1 回答 1

2

我认为这是不可能的,因为在第二种情况下,将执行一个查询,因此即使您发现任何错误,也不会插入任何数据,因为 SQL 服务器由于唯一约束而拒绝它。我不认为 Laravel 可以处理它。

可能这样的事情是妥协以更快地解决它:

foreach($categories as $category){
   $names[] = $category['name']
}

$dups = Category::whereIn('name', $names)->lists('name');

if ($dups) {
  // here you can log or display message that some categories won't be inserted
}

$namesIns = [];
$cat = [];
foreach($categories as $category){
    $item = ['category_name' => $category['name']];
    if (!in_array($category['name'], $dups) && !in_array($item, $cat)) {
      $cat[] = $item;
      $namesIns[] = $category['name'];
    }
}
Category::insert($cat);

$ids = Category::whereIn('name', $namesIns)->lists('id');
于 2014-10-26T10:30:19.557 回答