#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. дай мне попробовать один раз