我的应用程序中有一个名为“ 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服务器由于唯一约束而拒绝了该数据。我认为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');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句