Я создаю веб-сайт с расценками на работу как часть моего обучения в Laravel. Сайт позволяет торговцам добавлять материалы, которые используются для работы. Пользователь добавляет всю информацию в необходимые поля формы, такие как имя, описание должности и т. Д. c. Чтобы добавить материалы, я использовал ползунок, который может динамически добавлять новые строки.
Добавление строк и последующая отправка формы с использованием методов create / store работают. Если пользователь решит, что он хочет редактировать форму, любые материальные элементы будут отображены из базы данных. Я использую красноречивые отношения с (QuoteItem) ownTo и (Quote) hasMany . У меня проблема в том, что если пользователь хочет добавить новую строку или отредактировать существующие строки, как я могу сохранить эту информацию при отправке. Я попробовал метод updateOrCreate , но он не позволяет дублировать данные, пользователь может решить добавить один и тот же элемент дважды. Я могу обновить, используя идентификатор, прикрепленный только к существующим строкам, но не могу сохранить какие-либо дополнительные строки. Есть ли способ добиться этого? любая помощь приветствуется.
// Quote controller
public function edit(Quote $quote){
$user = Auth::user();
$date = Carbon::now()->format('j F Y');
return view('quotes.edit', compact('quote', 'date', 'user'));
}
public function update(Request $request, Quote $quote){
$this->validate($request, [
'description' => 'max:10000|nullable',
'quoteVat' => 'numeric|nullable',
'discount' => 'numeric|nullable',
'subTotal' => 'numeric|nullable',
'total' => 'numeric|nullable',
'notes' => 'max:5000|nullable',
'introduction' => 'max:5000|nullable',
'view_intro' => 'in:1|in:0',
'view_items' => 'in:1|in:0',
'view_jobdes' => 'in:1|in:0'
]);
//insert items from materials slide form
if($request->has('totalMaterials')){
//option to get all row entries stored in an array that have a total value
$totalMaterials = $request->totalMaterials;
//get all materials with an id
$request->material_id ? $material_id = $request->material_id : $material_id = false;
if($material_id){
foreach($material_id as $key => $value){
$item = QuoteItem::where('id', $material_id[$key])->first();
$data = [
'description' => $request->materialItem[$key],
'quantity' => $request->quantity[$key],
'unit_type' => '',
'item_type' => 'materials',
'price' => $request->priceMaterials[$key],
'total' => $request->totalMaterials[$key]
];
$item->update($data);
}
}
}
return back()->with('success', 'Quote created for '.$quote->job->name);
}
Blade :
Описание Количество Цена Общая стоимость Акция @foreach ($ quote-> quoteItems as $ materialItem) @if ($ materialItem-> item_type == 'materials') {{- добавлено для обновления существующих строк -}} @endif @endforeach