Как сделать копию записи с отношениями в бд?
У меня есть таблицы 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);
}
