Дублирование данных в контроллере Laravel

#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 или отменяете его!