Как реплицировать в php

Я пытаюсь создать функцию, которая будет реплицировать/клонировать/дублировать продукт, включая все его свойства и варианты доставки.

Однако мне удалось продублировать продукт, но варианты доставки не продублированы. Смотрите мои коды ниже;

Любая помощь будет высоко оценена

Спасибо

public function CreateProductPost(Request $request){
  if (Auth::user()->vendor == false) {
    return redirect()->route('profile');
  }
  if ($request->name == null) {
    session()->flash('errormessage','Product name is required');
    return redirect()->back()->withInput();
  }
  if (mb_strlen($request->name) > 60) {
    session()->flash('errormessage','Product name cannot be longer than 60 characters.');
    return redirect()->back()->withInput();
  }
  if ($request->category_id == null) {
    session()->flash('errormessage','Product category is required');
      $shippingoptions[] = $opt;
    }
  }
  $product = new Product;
  $product->name = $request->name;
  $product->uniqueid = random_int(10000, 99999);
  $product->category_id = $category->id;
  $product->description = $request->description;
  $product->refund_policy = $request->refund_policy;
  $product->fromc = $request->fromc;
  $product->tocount = $request->tocount;
  $product->price = $request->price;
  $product->currency = $request->currency;
  $product->inventory = $request->inventory;
  if ($request->image !== null) {
    $product->image = $request->image->store('uploads','public');
  }
  $product->buyout = 0;
  $product->fe = $fe;
  $product->seller_id = Auth::user()->id;
  $product->save();
  foreach ($shippingoptions as $opt) {
    $so = new ShippingOption();
    $so->product_id = $product->id;
    $so->desc = $opt['desc'];
    $so->days = $opt['days'];
    $so->price = $opt['price'];
    $so->save();
  }
  session()->flash('successmessage','Product successfully        created');
  return redirect()->route('products');
}
function DuplicateProductPost($uniqueid, Request $request){
      $product = Product::where('uniqueid',$uniqueid)->first();
      if ($product == null) {
        return redirect()->route('products');
      }
      if (Auth::user()->id !== $product->seller->id) {
        return redirect()->route('products');
      }
      $newProduct = $product->replicate();
      $newProduct->uniqueid = random_int(10000, 99999);
      $newProduct->save();
      session()->flash('successmessage','Product successfully duplicated');
      return redirect()->route('products');
    }

Любая помощь будет высоко оценена

Спасибо

Возможно, это поможет вам: stackoverflow.com/questions/23895126/…

kuh-chan 26.03.2019 20:32

Мне жаль бедного парня, который должен заполнить эту форму, получить одно сообщение об ошибке, заполнить еще несколько, получить еще одно сообщение об ошибке и т. д. Примерно через 3 раунда я закончил с сайтом. . просто говорю. Более эффективно (как с точки зрения кода, так и для ваших пользователей) найти все ошибки и показать их за один раз.

ArtisticPhoenix 26.03.2019 20:35

Используйте надлежащую проверку... Вы можете проверить каждый из ваших входных данных в одной проверке и вернуть все соответствующие ошибки в одном вызове, вместо того, чтобы возвращать первую ошибку снова и снова, пока они не исправят ее. См. laravel.com/docs/5.8/валидация для получения полной информации.

Tim Lewis 26.03.2019 20:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
473
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно воспроизвести обе модели Product и ShippingOption, поэтому используйте следующую логику:

$product = Product::where('uniqueid',$uniqueid)->first();
...
$newProduct = $product->replicate();
$newProduct->uniqueid = random_int(10000, 99999);
$newProduct->save();

foreach($product->shippingOptions AS $shippingOption){
  $newShippingOption = $shippingOption->replicate();
  $newShippingOption->product_id = $newProduct->id;
  $newShippingOption->save();
}

Обратите внимание, что между Product и ShippingOption должна быть связь, иначе вам нужно будет запросить их вручную:

$oldShippingOptions = ShippingOption::where("product_id", " = ", $product->id)->get();
foreach($oldShippingOptions AS $shippingOption){
  ...
}

Метод ->replicate() не клонирует все связанные записи, так как это может не соответствовать требованиям, поэтому вам нужно сделать это вручную.

Это волшебное решение. Большое спасибо. Кстати, а как это реализовать? $oldShippingOptions = ShippingOption::where("product_id", " = ", $product->id)->get(); foreach($oldShippingOptions AS $shippingOption){ ... }

Sammy 26.03.2019 21:03

Та же логика, что и в foreach выше. Логически $product->shippingOptions и $oldShippingOptions будут содержать одни и те же Collection из ShippingOption моделей.

Tim Lewis 26.03.2019 21:12

Другие вопросы по теме