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

标签 php mysql laravel eloquent multiple-insert

我的应用程序中有一个名为“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 的解决方案。

最佳答案

我认为这是不可能的,因为在第二种情况下,将执行一个查询,因此即使您发现任何错误,也不会插入任何数据,因为 SQL Server 由于唯一约束而拒绝它。我认为 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');

关于php - Laravel Eloquent -- 表中的多条记录插入(具有唯一约束的列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571622/

相关文章:

php - WordPress wp_insert_post 不插入标签

php - php 代码之前的 javascript 警报

mysql - 为什么 select count(*) 不使用数据库中的索引而使用另一个数据库中的索引?

mysql - 具有新连接的 Swift Vapor3 Raw SQL 查询

WinXP 上 VB6 中的 MySql ODBC 连接非常慢。同一网络上的其他机器速度很快

javascript - 如何在 v-for vue js 中创建增量变量

php - 使用PHP在mysql中拉取数据显示搜索表单结果

php - 规范化数据库表 "tags"

php - 在 Mac 上设置 Laravel php artisan migrate 错误 : No such file or directory

php - 拉维尔 |检索具有关系且特定 ID 除外的集合