Laravel-Eloquent——在一个表中插入多条记录(带有一个具有唯一约束的列)


Laravel Eloquent -- Multiple record insertion in a table (with a column with unique constraint)

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

错误的解决方案:

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

这可能是一个解决方案,但这不是一个好的解决方案。问题是什么时候会有成千上万的记录,这会对数据库进行大量查询。这是不好的。

比较berter解决方案

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

但当我尝试插入一个重复的"category_name"时,它会抛出一个异常,并且没有插入任何类别名称。

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

我认为这是不可能的,因为在第二种情况下,将执行一个查询,所以即使您发现任何错误,也不会插入任何数据,因为SQL server因为唯一约束而拒绝它。我不认为拉拉维尔能应付。

也许这样的事情是为了更快地解决它而做出的妥协:

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');
相关文章: