#php #mysql #laravel #laravel-5
#php #mysql #laravel #laravel-5
Вопрос:
Я пытаюсь дублировать данные одним нажатием кнопки, проще говоря, пытаясь изменить предыдущий порядок. Это мой код
$order = Order::find($id);
$order_details = OrderDetail::where('order_id', $id)->get();
$reorder = $order->replicate();
$reorder_details = $order_details->replicate();
$reorder->save();
$reorder_details->save();
$order
Данные реплицируются нормально, однако $order_details
данные этого не делают, поскольку я получаю эту ошибку Method IlluminateDatabaseEloquentCollection::replicate does not exist.
Есть ли способ дублировать без использования replicate()
?
Ответ №1:
Это потому, что $order = Order::find($id);
возвращает первый экземпляр (модель) и $order_details = OrderDetail::where('order_id', $id)->get();
возвращает коллекцию. Просто нужно изменить его на $order_details = OrderDetail::where('order_id', $id)->first();
, и он будет работать нормально.
Для обработки нескольких деталей заказа:
$order_details = OrderDetail::where('order_id', $id)->get()->each(function($item) use($reorder){
$newItem = $item->replicate();
$newItem->order_id = $reorder->id; //If needed, be sure to pass $order if you do
$newItem->save();
});
Комментарии:
1. Отлично! Будет ли это работать, если есть несколько элементов с одинаковым идентификатором, и если нет, то как я могу это реализовать?
2. Если вам нужно скопировать несколько деталей, вы можете использовать
each()
в коллекции после ее получения. Смотрите мою правку.3. @John примечание Я думаю, вам нужно было бы установить
order_id
в каждомorder_detail
идентификатор реплицируемого заказа. Если вы просто реплицируете order_detail, он сохранит предыдущий (он же оригинальный) order_id
Ответ №2:
Вы можете использовать __clone()
метод, который вы можете реализовать внутри класса order,
Затем вы можете использовать его следующим образом
$order = Order::find($id);
$newOrder = clone $order;
$newOrder->save();
Комментарии:
1. Я предполагаю, что это также дублировало бы его первичный ключ, что впоследствии вызовет проблемы при попытке сохранить
Order
.2. Я думаю, не потому, что вы можете указать это в
function __clone()
том, что вы реализуете внутри объекта, вы просто устанавливаете идентификатор равным null или отменяете его!