grozavule's avatar

File Upload Produces Duplicate Database Entry

I have a form that uploads multiple files. Somehow the controller that handles the request creates two database records for each uploaded file. The HTTP request shows the proper number of files sent. The $request object passed into the controller method shows each file twice.

Here is the controller method:

public function store(Request $request)
    {
        $validInput = Validator::make($request->all(), [
            'first_name' => ['required', 'string', 'max:35'],
            'last_name' => ['required', 'string', 'max:50'],
            'email_address' => ['required', 'email:rfc,dns', 'max:125'],
            'phone_number' => ['required', 'string', 'max:15', 'regex:/^[+]*[0-9]*\s*[(]*[0-9]{3}[)]*[\s\.\-]*[0-9]{3}[\.\-]*[0-9]{4}$/'],
            'quantity' => ['required', 'integer','min:1'],
            'material' => ['required', 'string', 'max:50'],
            'due_date' => ['required', 'after:today'],
            'company_name' => ['required', 'string', 'max:75'],
            'files' => ['required']
        ]);

        if($validInput->fails())
        {
            return Response::json($validInput->errors(), 400);
        }

        $quote = new Quote;
        $quote->first_name = $request->input('first_name');
        $quote->last_name = $request->input('last_name');
        $quote->email_address = $request->input('email_address');
        $quote->phone_number = $request->input('phone_number');
        $quote->quantity = $request->input('quantity');
        $quote->material = $request->input('material');
        $quote->due_date = $request->input('due_date');
        $quote->company_name = $request->input('company_name');
        $quote->save();

        $counter = 0;
        foreach ($request->file('files') as $file) {
            $path = $file->storeAs(
                'quote-requests/' . str_replace(' ', '_', $quote->company_name) . '/' . $quote->id,
                $file->getClientOriginalName()
            );
            $quote->files()->create([
                'quote_id' => $quote->id,
                'file_uri' => $path
            ]);
            $counter++;
        }
        if($counter === 0)
        {
            return Response::json(['files' => 'No files were received. Please try again'], 400);
        }

        return Response::json(['success' => 'Thank you. Your request has been received.'], 200);
    }

Any ideas why it is duplicating records for each file sent via the form?

0 likes
1 reply
neilstee's avatar
neilstee
Best Answer
Level 34

@grozavule you don't need to pass the quote_id:

$quote->files()->create([
	'file_uri' => $path
]);

Please or to participate in this conversation.