averuga
@averuga

Нужно ли упростить код контроллера для сохранения моделей динамической формы?

Здравствуйте, друзья!

Посоветуйте, пожалуйста, нужно ли упростить (рефакторинг) код контроллера для сохранения моделей динамической формы "Карточка продукта"? Поля основной модели (типовые свойства товара) статические, поля изображений товара вспомогательной модели - динамические.
Особенно интересует, можно ли (и нужно ли!) не дожидаться сохранения основной модели в БД и привязывать динамические поля к основной One To Мany "на лету"? Сейчас я дожидаюcь id основной модели - как это сделать?

Кликни на меня - > ProductController.php
public function store(Request $request)
    {

        // Сохраняем поле "Название продукта" основной модели и получаем id записи
        $product_title = (['product_title' => $request->product_title]);     
        $product_title = Product::create($product_title);   
        
        //Транспонируем массив и сохраняем динамические поля "Изображений"
        //Cвязь основной и дочерней модели One To Мany
        //https://laravel-news.ru/blog/tutorials/cleaning-up-form-input-with-transpose

        $requestData = collect($request->only('photo_filenames', 'photo_titles', 'photo_descs'));

        $photos = $requestData->transpose()->map(function ($photoData) {
        return new Photo([
            'photo_filename'    => $photoData[0], 
            'photo_title'       => $photoData[1],           
            'photo_desc'        => $photoData[2],
         ]);       
        });

        Product::find($product_title->id)->photos()->saveMany($photos);

        return back();        

    }

  • Вопрос задан
  • 221 просмотр
Пригласить эксперта
Ответы на вопрос 3
JhaoDa
@JhaoDa
LaravelRUS Team
Нужно. Только не рефакторить, а начать с изучения Laravel (и PSR-2/12 обязательно).

Особенно интересует, можно ли (и нужно ли!) не дожидаться сохранения основной модели в БД и привязывать динамические поля к основной One To Мany "на лету"? Сейчас я дожидаюcь id основной модели - как это сделать?
Можно, uuid в помощь.
Ответ написан
greabock
@greabock
Могу
Мои глаза... Мужик, тебе бы реально базу подтянуть по пыху. Чет совсем все плохо у тебя. Какое-то невнятное жонглирование ненужными переменными.

public function store(Request $request)
{
    Product::create($request->only('product_title'))->photos()->saveMany(array_map(function($photo_filename,  $photo_title, $photo_desc){
        return new Photo(compact('photo_filename', 'photo_title', 'photo_desc'));
    },  ...$request->only('photo_filenames', 'photo_titles', 'photo_descs')));
    
    return back();
}
Ответ написан
@markinigor
Еще как вариант можно сразу создавать заготовку продукта и отдавать её в методе create
public function create(Product $product)
    {
        if (! $product->exists) {
            $product = $this->createAndReturnSkeletonProduct(); //создаешь в методе заготовку, с нужными тебе полями
            return redirect()->route('products.create', $product);
        }
        
        return view('products.create', compact('product')]); 
    }

// И пару роутов ведущих в один метод контроллера:
    Route::get('products/create', 'ProductController@create')->name('products.create.start');
    Route::get('products/{product}/create', 'ProductController@create')->name('products.create');


И у тебя всегда будет товар создаваться раньше до его связей.
Заготовки периодически подчищать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы