ashish ashish - 3 months ago 36
PHP Question

Laravel 5.2 Inserting and updating data from dynamic form

So far, I have found answers in here and never needed to ask anything. But this issue is really bugging me. Here is the situation. I have a dynamic invoice form. Posts from the form will be saved to two different tables


  1. invoices(where details for invoice is stored like member_id, discount, duedate, remarks and the timestamps)

  2. invoiceitems(invoice_id, itemdescription, quantity, rate, timestamps)



To achieve this, here is my method to store invoice

public function store(InvoiceRequest $request)
{

//get necessary details for invoice table
$datainvoice = array(
'member_id' => $request->input('member_id'),
'duedate' => $request->input('duedate'),
'discount' => $request->input('discount'),
'remarks' => $request->input('remarks'),
//'gtotal' => $request->input ('gtotal'),
);

//save result of invoice
$resultforinvoice = Invoice::create($datainvoice);


// ready all data of invoice items
$datainvoiceitem = array(
'description' => $request->input('description'),
'rate' => $request->input('rate'),
'quantity' => $request->input('quantity'),
'invoice_id' => $resultforinvoice->id,
);


// insert invoice along with invoice_id
Invoiceitem::create($datainvoiceitem);
return redirect('members');

}


Additional Information:

Relationship between members and invoices:: member-has-many-invoices, invoice-belongs-to-single-member

Relationship between invoice and invoiceitems:: invoice-has-many-items,
an-item-belongs-to-one-invoice

partial of the dynamic form:

<td> 1 </td>
<td><textarea type="text" name='description[0][description]' class="form-control"/></textarea> </td>
<td><input type="text" name='quantity[0][quantity]' class="form-control"/></td>
<td> <input type="text" name='rate[0][rate]' class="form-control"/> </td>


Errors im receiving right now Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, integer given, called in C:\xampp\htdocs\study\vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\Grammar.php on line 719 and defined

Update

when i try to return the inputs for invoiceitems to check whats going on, i get an array like below

{
"description": [
{
"description": "desc1"
},
{
"description": "desc2"
}
],
"rate": [
{
"rate": "11"
},
{
"rate": "22"
}
],
"quantity": [
{
"quantity": "1"
},
{
"quantity": "2"
}
],
"invoice_id": 41

}


Guys, please tell let me know where im missing. I have tried asking this in laracast as well, its been couple of hours nothing at the moment, hopefully someone will point me to right direction. Here is the laracast link.

Answer

I ended up updating majority of the code and now it looks like this

 $items = [];
    foreach ($request->items as $field => $values) {
        foreach ($values as $index => $value) {
            $items[$index][$field] = $value;
        }
    }


    Invoice::create($invoice)
        ->invoiceitem()->createMany($items);

and it just worked. Let me know anyone else needs help with this. I would be happy to explain

Comments