我正在使用Laravel 5.5,我想在将一组数据插入mysql时排除重复记录。
例如,有一个表students
,它包含以下字段:
id
name
gender
现在我将一组数据插入students
,如果不介意重复记录,我可以这样做:
public function insert()
{
$newStudents=[
['name'=>'Jim','gender'=>'boy'],
['name'=>'Lucy','gender'=>'girl'],
['name'=>'Jack','gender'=>'boy'],
['name'=>'Alice','gender'=>'girl']
];
DB::table('students')->insert($newStudents);
}
现在我不想插入重复的记录。(副本是:name
和gender
都有相同的值,而不是一个字段具有相同的值。)
我该怎么办?
答案 0 :(得分:2)
您可以使用独特的集合助手。请参阅以下代码:
$newStudents=collect([
['name'=>'Jim','gender'=>'boy'],
['name'=>'Lucy','gender'=>'girl'],
['name'=>'Jack','gender'=>'boy'],
['name'=>'Alice','gender'=>'girl'],
['name'=>'Alice','gender'=>'girl']
])->unique(function ($student) {
return $student['name'].$student['gender'];
})->toArray();
DB::table('students')->insert($newStudents);
上面的代码只会插入唯一的记录,即使那里有重复的记录。
有关详细信息,请参阅此处:https://laravel.com/docs/5.4/collections#method-unique
答案 1 :(得分:0)
您可以在数据库中为名称和性别创建唯一索引。但是,当你尝试保存它们时,你会得到我猜错的MySQL错误。因此,您可以使用unique
进行where
验证。
Validator::make($student, [
'gender' => [
'required',
Rule::in(['boy', 'girl']),
],
'name' => Rule::unique('students')->where(function ($query) use ($student) {
$query->where('gender', $student['gender']);
})
]);
然后,您可以运行您的收藏并过滤掉那些在@ pseudoanime的答案中无效的内容。