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