Как клонировать данные, которые имеют самореляционную/ самореляционную ссылку в laravel

#laravel #laravel-6

Вопрос:

Как реплицировать/клонировать все данные в таблице, которая имеет отношение к себе в Laravel?

У меня есть этот стол:

таблица участников

ID идентификатор участника идентификатор компании Имя
1 нулевой 23 Джон
2 1 23 Джеймс
3 1 23 Кругозор
4 нулевой 23 Тест
5 3 23 Макс

СУЩЕСТВУЮЩИЙ КОД

И я хочу воспроизвести все данные, которые имеют company_id 23 использование

 $members = Members::where['company_id' => 23]->get();
foreach ($members as $member) {
   $duplicate = $member->replicate()->fill(['company_id' => 24);
   $duplicate->save();
}
 

Результаты выполнения кода

таблица участников

ID идентификатор участника идентификатор компании Имя
1 нулевой 23 Джон
2 1 23 Джеймс
3 1 23 Кругозор
4 нулевой 23 Тест
5 3 23 Макс
6 нулевой 24 Джон
7 1 24 Джеймс
8 1 24 Кругозор
9 нулевой 24 Тест
10 3 24 Макс

Но в этом коде воспроизведение отношений с самим собой неверно. Как я могу это сделать?

Ожидаемый результат

таблица участников

ID идентификатор участника идентификатор компании Имя
1 нулевой 23 Джон
2 1 23 Джеймс
3 1 23 Кругозор
4 нулевой 23 Тест
5 3 23 Макс
6 нулевой 24 Джон
7 6 24 Джеймс
8 6 24 Кругозор
9 нулевой 24 Тест
10 8 24 Макс

Мне жаль, если мой английский испорчен, но я надеюсь, вы понимаете, что я пытаюсь сделать. Спасибо!

Комментарии:

1. @JohnLobo извините, что я только что добавил результаты текущего кода. В существующем коде нет ошибки, просто результат кода-это не то, что я пытаюсь сделать.

2. да, теперь он обновлен с ожидаемым результатом

Ответ №1:

Попробуй это .У вас есть два варианта для репликации

 $members = Members::where(['company_id' => 23])->get();
foreach ($members as $member) {
   
    $duplicate = $member->replicate();
    $duplicate->company_id=24;
    $duplicate->save();
}
});
 

или

 $members = Members::where(['company_id' => 23])->get();
    foreach ($members as $member) {
        
        $duplicate = $member->replicate()->fill(['company_id'=>24]);
       
        $duplicate->save();
    }
    });
 

Обновленный

 $members = Members::where(['company_id' => 23])->get();
    $tempIdMap=[];
    foreach ($members as $key=>$member) {
        if($key==0){
          $tempIdMap[$member->id]=$member->member_id;
         }
        $duplicate = $member->replicate()->fill(['company_id'=>24,'member_id'=>isset( $tempIdMap[$member->member_id])? $tempIdMap[$member->member_id]:null]);

        $duplicate->save();

        $tempIdMap[$member->id]=$duplicate->id;

    }
 

Комментарии:

1. Спасибо за ваш ответ, но, к сожалению, это не то, что я пытаюсь сделать.

2. у меня есть обновленный ответ.если возникнут какие-либо проблемы, дайте мне знать, что я не тестировал.

3. @Карл. я проверил это .это работает как ожидаемый результат. если возникнут какие-либо проблемы, дайте мне знать. также снова изменился код

4. Я попробовал, и это сработало, но он получил неправильный вывод, если в первой записи участника есть a member_id . Попробуйте, например: id=1, идентификатор участника=3, идентификатор компании=23, имя=Джон

5. дай мне попробовать один раз