Laravel 5.2从动态表单插入和更新数据

时间:2016-07-31 08:21:08

标签: php laravel eloquent laravel-5.2 bulkinsert

到目前为止,我在这里找到了答案,从不需要提出任何问题。但这个问题真的让我烦恼。情况就是这样。我有一张动态发票表格。表单中的帖子将保存到两个不同的表格

  1. 发票(其中存储发票的详细信息,如member_id,折扣,duedate,备注和时间戳)
  2. invoiceitems(invoice_id,itemdescription,数量,费率,时间戳)
  3. 为实现此目的,这是我存储发票的方法

    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');
    
    }
    

    其他信息:

    会员与发票之间的关系::会员拥有多张发票,发票属于单一会员

    发票和invoiceitems之间的关系:: invoice-has-many-items, 一个项目-属于对一发票

    动态形式的一部分:

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

    我现在正在接收的错误传递给Illuminate \ Database \ Grammar :: parameterize()的参数1必须是类型数组,给定整数,在C:\ xampp \ htdocs \ study \ vendor \ laravel \ framework \ src中调用\ Illuminate \ Database \ Query \ Grammars \ Grammar.php在719行并定义

    更新

    当我尝试返回invoiceitems的输入以检查最新情况时,我得到一个如下所示的数组

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

    伙计们,请告诉我知道我失踪的地方。我也试过在laracast中问这个问题,此刻它几个小时都没有,希望有人能指出我正确的方向。 Here is the laracast link.

2 个答案:

答案 0 :(得分:0)

我可以建议

public function store(InvoiceRequest $request)
{
    $invoice_fields = ['member_id', 'duedate', 'discount', 'remarks', 'gtotal'];

    $items = [];

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

    Invoice::create($request->only($invoice_fields))
        ->items()->createMany($items);

    return redirect('members');    
}

(如果您正确设置了关系,则无需手动将invoice_id分配给每个项目,只需拥有项目的发票create

您可以将foreach抽象为一个单独的方法,教程建议的收集宏可能是一个好主意(虽然我的实现方式不同;我的建议并不需要原始索引号HTML)。 表单的HTML应该是

<input type="text" name="items[description][]">
<input type="text" name="items[quantity][]">
<input type="text" name="items[rate][]">

<input type="text" name="items[description][]">   <!-- as many of --> 
<input type="text" name="items[quantity][]">      <!-- these      -->
<input type="text" name="items[rate][]">          <!-- as needed  -->

答案 1 :(得分:0)

我最终更新了大部分代码,现在它看起来像这样

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


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

它刚刚起作用。让我知道其他人需要帮助。我很乐意解释