在保存之前检查存储中重复项的最佳方法功能



我有一个基于团队的应用程序,其中一个数据库为多个团队提供服务。我们有一个自定义字段表,除了每个团队普遍可用的全局字段外,它还允许每个团队创建自己想要创建的自定义字段。每个自定义字段记录在 create.blade 输入表单中都有一个名称、类型和church_id字段。现在,由于拥有独立团队的性质,我们需要一个系统,他们可以在其中创建自己的自定义字段,该字段可能与创建并连接到另一个教会团队的自定义字段共享相同的名称。这已经完成并且工作得很好。

问题是我们还需要这样做,以便在同一教会团队中只能创建一个具有特定名称的自定义字段。我们不希望同一个教会团队中有重复的字段。这就是我的问题,存储功能中防止重复项发生在同一基于团队的记录中的最佳方法是什么。我已经看过firstOrNew,firstOrCreate和updateOrCreate,但哪一个最适合我的需求。

正如我所说,表单中的字段是"名称"、"类型"和"church_id",这些字段对应于自定义字段数据库字段"名称"、"类型"和"created_by_team_id"。我需要做的是让系统检查是否有与输入"名称"匹配的记录与输入"church_id共享相同的"created_by_team_id"。如果该"名称"的记录也共享行进的"id",则系统会将其识别为重复记录,并且不会在数据库中创建新记录。但是,如果有一条记录共享相同的"名称"但不共享相同的"created_by_team_id/church_id",则系统会继续创建该新记录,因为它不是重复的。

这是我的创建函数:

{
if (! Gate::allows('custom_field_create')) {
return abort(401);
}
if (auth()->user()->role->contains(1)) {
$churches = Team::all();
$churchArr = array('empty' => 'Please select a church...');
foreach ($churches as $church) {
$churchArr[$church->id] = $church->name;
}
$churches->created_by_id      = auth()->user()->id;
$church_id = null;
} else {
$churches = false;
$church_id = auth()->user()->team_id;
$churchArr = [];
}
return view('admin.custom_fields.create', compact('churches', 'churchArr', 'church_id'));

这是我的存储功能:

{
if (! Gate::allows('custom_field_create')) {
return abort(401);
}
$custom_field = CustomField::create($request->all());
$custom_field->created_by_team_id = $request->input('church_id');
$custom_field->save();

return redirect()->route('admin.custom_fields.index');

正如我所说,我一直在查看并尝试第一个OrNew,firstOrCreate和updateOrCreate方法,但我所有的尝试都失败了。实现这些方法之一的正确方法是什么,以使用我的字段和数据库条件实现我的目标,以避免在同一基于团队的 ID 中创建具有相同名称的重复字段?

我发现可行的解决方案是updateOrCreate。这允许同时使用"名称"和"类型"来匹配。如果找到其中一个但找不到另一个,它将创建一个新记录。如果两者都找到,它只会更新记录,这本质上避免了重复创建。这允许"church_id"字段仅作为填充物添加,而不是将其用作键入的字段之一。

$custom_field = CustomField::updateOrCreate(['name' => $request->input('name'), 'type' => $request->input('type')]);
$custom_field->created_by_team_id = $request->input('church_id');
$custom_field->save();

最新更新