Как обновить существующие строки и одновременно сохранить дополнительные строки в форме Laravel - PullRequest
0 голосов
/ 05 августа 2020

Я создаю веб-сайт с расценками на работу как часть моего обучения в Laravel. Сайт позволяет торговцам добавлять материалы, которые используются для работы. Пользователь добавляет всю информацию в необходимые поля формы, такие как имя, описание должности и т. Д. c. Чтобы добавить материалы, я использовал ползунок, который может динамически добавлять новые строки.

Добавление строк и последующая отправка формы с использованием методов create / store работают. Если пользователь решит, что он хочет редактировать форму, любые материальные элементы будут отображены из базы данных. Я использую красноречивые отношения с (QuoteItem) ownTo и (Quote) hasMany . У меня проблема в том, что если пользователь хочет добавить новую строку или отредактировать существующие строки, как я могу сохранить эту информацию при отправке. Я попробовал метод updateOrCreate , но он не позволяет дублировать данные, пользователь может решить добавить один и тот же элемент дважды. Я могу обновить, используя идентификатор, прикрепленный только к существующим строкам, но не могу сохранить какие-либо дополнительные строки. Есть ли способ добиться этого? любая помощь приветствуется.

enter image description here

// 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     
...