我的应用程序中有一个名为“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/