Найти дубликаты в Laravel Eloquent - PullRequest
0 голосов
/ 28 мая 2019

Следующий код, который у меня есть на контроллере, находится ниже.

public function add(Request $request)
{
    $request->validate([
        'userSelected' => 'required',
        'projectSelected' => 'required',
    ]);

    $researcherToProject = new ProjectResearchers();
    $researcherToProject->user_id = $request->userSelected;
    $researcherToProject->project_id = $request->projectSelected;
    $researcherToProject->created_at = Carbon::now();
    $researcherToProject->updated_at = Carbon::now();
    $researcherToProject->save();

    return new ProjectsResearchersResource($researcherToProject);
}

Должен ли я сделать еще одну проверку или создать функцию?

Пример: я создаю идентификатор пользователя "5" с идентификатором проекта "13" и идентификатор пользователя "2" с идентификатором проекта "17". Если я попытаюсь снова создать идентификатор пользователя «5» с идентификатором проекта «13», это позволит мне, так что я получу два раза одни и те же данные в базе данных. Как мне избежать повторяющихся записей?

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Вы можете сделать это, используя метод updateOrCreate, первый массив - это уникальные значения, которые вы ищете, если он не найден, он создаст запись, если он их найдет, он просто обновит поля во втором массиве так, сделайте это вместо:

public function add(Request $request){

    $request->validate([
        'userSelected' => 'required', 
        'projectSelected' => 'required',     
    ]);

    $researcherToProject = ProjectResearchers::updateOrCreate(
        ['user_id' => $request->userSelected, 'project_id' => $request->projectSelected],
        ['created_at' => Carbon::now(), 'updated_at' => Carbon::now()] 
    );

    return new ProjectsResearchersResource($researcherToProject);
}

или, если вы вообще не хотите обновляться, вы можете просто проверить, существует ли оно перед сохранением:

public function add(Request $request){

    $request->validate([
        'userSelected' => 'required', 
        'projectSelected' => 'required',     
    ]);

       $researcherToProject = new ProjectResearchers(); 

    if( ! ProjectResearchers::where('user_id', $request->userSelected)->where('project_id', $request->projectSelected)->exists()) {
       $researcherToProject = new ProjectResearchers(); 
       $researcherToProject->user_id = $request->userSelected;
       $researcherToProject->project_id = $request->projectSelected;
       $researcherToProject->created_at = Carbon::now();
       $researcherToProject->updated_at = Carbon::now();

       $researcherToProject->save();
    } else {
        $researcherToProject = ProjectResearchers::where('user_id', $request->userSelected)->where('project_id', $request->projectSelected)->first(); 
    }

    return new ProjectsResearchersResource($researcherToProject);
}
0 голосов
/ 28 мая 2019

изменить следующее:

    $request->validate([
        'userSelected' => 'required', 
        'projectSelected' => 'required',     
    ]);

до

    $request->validate([
        'userSelected' => 'required', 
        'projectSelected' => 'required|unique:ProjectResearchers,project_id,NULL,id,user_id,'.$request->userSelected   
    ]);

это будет работать, проверяя, существует ли уже комбинация пользовательского проекта в таблице с именем ProjectResearchers. для получения дополнительной информации об уникальном правиле проверки посетите документацию Laravel .

0 голосов
/ 28 мая 2019

Дополнительно к @nakov ответ:

firstOrCreate() может сочетать 2 способа и выглядит чище:

public function add(Request $request){
    $request->validate([
        'userSelected' => 'required', 
        'projectSelected' => 'required',     
    ]);

    $researcherToProject = ProjectResearchers::firstOrCreate([
        'user_id' => $request->userSelected,
        'project_id' => $request->projectSelected
    ]); 

    $researcherToProject->created_at = Carbon::now();
    $researcherToProject->updated_at = Carbon::now();
    $researcherToProject->save();

    return new ProjectsResearchersResource($researcherToProject);
}

Или, если вы не хотите обновлять:

public function add(Request $request){
    $request->validate([
        'userSelected' => 'required', 
        'projectSelected' => 'required',     
    ]);

    $researcherToProject = ProjectResearchers::firstOrCreate([
        'user_id' => $request->userSelected,
        'project_id' => $request->projectSelected
    ]);

    if(!$researcherToProject->id){
        $researcherToProject->created_at = Carbon::now();
        $researcherToProject->updated_at = Carbon::now();
        $researcherToProject->save();
    }

    return new ProjectsResearchersResource($researcherToProject);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...