Laravel 5.2 从动态表单插入和更新数据
Laravel 5.2 Inserting and updating data from dynamic form
到目前为止,我已经在这里找到了答案,不需要再问任何问题。但是这个问题真的很困扰我。这是情况。我有一个动态发票表格。表单中的帖子将保存到两个不同的表中
- 发票(存储发票详细信息的地方,如 member_id、折扣、截止日期、备注和时间戳)
- 发票项目(invoice_id,项目描述,数量,费率,时间戳)
为了实现这一点,这是我存储发票的方法
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');
}
附加信息:
会员和发票之间的关系::会员有很多发票,发票属于单个会员
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 行和定义
更新
当我尝试 return 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.
我可以建议
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 -->
我最终更新了大部分代码,现在看起来像这样
$items = [];
foreach ($request->items as $field => $values) {
foreach ($values as $index => $value) {
$items[$index][$field] = $value;
}
}
Invoice::create($invoice)
->invoiceitem()->createMany($items);
它刚刚奏效。让我知道其他人需要这方面的帮助。我很乐意解释
到目前为止,我已经在这里找到了答案,不需要再问任何问题。但是这个问题真的很困扰我。这是情况。我有一个动态发票表格。表单中的帖子将保存到两个不同的表中
- 发票(存储发票详细信息的地方,如 member_id、折扣、截止日期、备注和时间戳)
- 发票项目(invoice_id,项目描述,数量,费率,时间戳)
为了实现这一点,这是我存储发票的方法
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');
}
附加信息:
会员和发票之间的关系::会员有很多发票,发票属于单个会员
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 行和定义
更新
当我尝试 return 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.
我可以建议
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 -->
我最终更新了大部分代码,现在看起来像这样
$items = [];
foreach ($request->items as $field => $values) {
foreach ($values as $index => $value) {
$items[$index][$field] = $value;
}
}
Invoice::create($invoice)
->invoiceitem()->createMany($items);
它刚刚奏效。让我知道其他人需要这方面的帮助。我很乐意解释