【问题标题】:Laravel 5.2 Inserting and updating data from dynamic formLaravel 5.2 从动态表单插入和更新数据
【发布时间】:2016-12-05 13:04:42
【问题描述】:

到目前为止,我已经在这里找到了答案,并且不需要问任何事情。但是这个问题真的很困扰我。这是情况。我有一个动态发票表格。表单中的帖子将保存到两个不同的表格中

  1. 发票(其中存储发票的详细信息,例如 member_id、折扣、到期日、备注和时间戳)
  2. invoiceitems(invoice_id、itemdescription、数量、费率、时间戳)

为了实现这一点,这是我存储发票的方法

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

}

其他信息:

成员和发票之间的关系:: member-has-many-invoices, invoice-belongs-to-single-member

invoice 和 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.

【问题讨论】:

  • 根据您的输入名称$request-&gt;input('description') 返回一个数组而不是单个值。之后,您尝试将此数组保存为列值。我不确定,但我认为这是你的问题。
  • @Phargelm 我正在尝试使用 transpose() 对其进行排序,一旦我有一个正常运行的代码,我将保持更新
  • @Phargelm 我正在遵循教程link 现在,我正确获取了数组,但我想添加额外的信息,比如数组中的 invoice_id。你能指出我正确的方向吗?我在这里更新我的东西,link

标签: php laravel eloquent laravel-5.2 bulkinsert


【解决方案1】:

我可以建议

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 分配给每个项目,只需将 Invoice create 该项目)。


您可以将foreachs 抽象为一个单独的方法,如教程建议的那样,Collection 宏可能是一个好主意(尽管我实现它的方式不同;我的建议不需要原始 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  -->

【讨论】:

  • 这真的会简化整个事情,更新表单会简单得多,但一件事,因为我们使用名称表单字段作为项目[描述] [],没有索引,我们如何验证表格?你能给我一些想法吗?
  • 没关系!!解决了:当我完成后我会发布整个事情!
【解决方案2】:

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

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


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

而且它刚刚奏效。让我知道其他人需要帮助。我很乐意解释

【讨论】:

  • 我就是这样做的! foreach($items as $item) { $invoice-&gt;invoiceitem()-&gt;updateOrCreate(['id'=&gt; $item['id']],$item); }
  • 如果你删除一些旧的并添加新的会怎样
  • @ashish 你能帮我解决这个问题吗[stackoverflow.com/questions/44540484/….我可以插入新行但无法更新它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多