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

时间:2014-10-26 09:34:29

标签: php mysql laravel eloquent multiple-insert

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

糟糕的解决方案:

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

这可以是一个解决方案,但这不是一个好的问题。问题是当有数量的猎人或成千上万的记录时,这会对数据库产生大量的疑问。这不好。

Comparativel berter Solution

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

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

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

1 个答案:

答案 0 :(得分: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');