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();
}
Особенно интересует, можно ли (и нужно ли!) не дожидаться сохранения основной модели в БД и привязывать динамические поля к основной One To Мany "на лету"? Сейчас я дожидаюcь id основной модели - как это сделать?Можно, uuid в помощь.
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();
}
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');