Как сделать копию записи с отношениями в бд?

У меня есть таблицы Orders, и связывающая таблица Equipment_order.

введите сюда описание изображения Как мне сделать копию записи в Orders со всеми отношениями.

введите сюда описание изображения

Я перепробовал несколько способов (atach, sync), и не один не дал нужного результат. Чаще всего в связывающей таб. появляется запись но с пустыми полями.


Ответы (2 шт):

Автор решения: Xaku

Попробуйте вот таким образом

$order = Order::with('equipments')->find(1);

$clone = $order->toArray();
$equipments = $clone['equipments'];
unset($clone['equipments'], $clone['id']);

$clone_order_id = Order::insertGetId($clone);

if (!empty($equipments) && count($equipments) > 0) {
    foreach ($equipments as $equipment) {
        $equipment['order_id'] = $clone_order_id;
        EquipmentOrder::insert($equipment);
    }
}
→ Ссылка
Автор решения: Daniel Protopopov

Вы можете использовать метод replicate для создания несохраненной копии модели. После создания этой копии вам нужно подгрузить нужные отношения, сохранить копию используя push метод Eloquent модели и отношения через sync.

Ниже копия ответа из англоязычного SO:

//копируем свойства
$new = $this->replicate();

//Сохраняем копию чтобы был её идентификатор
$new->push();

// сбросить отношения чтобы можно было выбрать какие сохранять из копируемой модели
$this->relations = [];

// загрузить нужные отношения для сохранения из копируемой модели
$this->load('relation1','relation2');

// сохраняем выбранные отношения из копируемой в новую копию
foreach ($this->relations as $relationName => $values){
    $new->{$relationName}()->sync($values);
}
→ Ссылка