以下是我在Laravel 5.2中实现主 - 详细信息页面的两个模型,刀片页面和控制器。我想知道如何将详细信息部分更新回数据库。
1)主模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $fillable = [
'id',
'name',
'created_at',
'updated_at'
];
public function detail()
{
return $this->hasMany('App\OrderDetail','fid','id');
}
public function getDetailCountAttribute()
{
return $this->hasMany('App\OrderDetail','fid','id')->count();
}
public static function boot()
{
parent::boot();
// cause a delete of a product to cascade to children so they are also deleted
static::deleted(function($order)
{
$order->detail()->delete();
});
}
}
2)细节模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class OrderDetail extends Model
{
protected $fillable = [
'id',
'oid',
'item',
'total',
'created_at',
'updated_at'
];
}
3)主详细信息页面(部分),在OrderDetail部分,jQuery应用于动态添加表格中的项目。
<body>
<h1>Order Edit</h1>
{!! Form::model($order,['method' => 'PATCH','route'=>['order.update',$order->id]]) !!}
<div class="form-group">
ORDER ID:{{$order->id}}
<br /><br />
</div>
<div class="form-group">
{!! Form::label('order Name', 'ORDER NAME:') !!}
{!! Form::text('name',$order->name,['class'=>'form-control']) !!}
</div>
<div class="form-group">
<!--order detail part start-->
<br />
{{ Form::select('productInput', $product,'',['ID'=>'productInput']) }}
{{ Form::number('productQtyInput','',['class'=>'form-control','style'=>'width:250px','ID'=>'OrderQtyInput']) }}
{{ Form::button('Add',['onclick'=>'product_add();']) }}
<br />
<table class="table table-striped table-bordered table-hover" style="width:30%;" border=1 id="TblOrderList" >
<thead>
<tr class="bg-info" id="ingHEADER">
<th width=2%>PRODUCTID</th>
<th width=5% >PRODUCT</th>
<th width=5%>QTY</th>
<th width=5% colspan=2>COMMAND</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<!--order detail part end-->
</div>
<div class="form-group">
{!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}
</div>
{!! Form::close() !!}
</body>
<script type="text/javascript">
function product_add(){
var ingID =$( "#productInput").val();
var ingName =$( "#productInput option:selected").text();
var ingQty =$("#productQtyInput").val();
var rowCount = $('#TblOrderList .ingData').length;
rowCount++;
var outHTML =
'<tr class="ingData" id="ingRow' + rowCount + '">'
+ '<td><div id="ingID' + rowCount + '">' + ingID + '</div></td>'
+ '<td><div id="ingName' + rowCount + '">' + ingName + '</div></td>'
+ '<td><input type="number" id="ingQTY' + rowCount + '" value="' + ingQty + '"/></td>'
+ '<td>'
+ '<button class="OrderREMOVE" type="button">DELETE</button>'
+ '<button class="OrderUP" type="button">up</button>'
+ '<button class="OrderDOWN" type="button">down</button>'
+ '</td>'
+ '</tr>';
$('#TblOrderList tr:last').after(outHTML);
$('#ingUNIT' + rowCount)
.find('option[value="' + ingUnit + '"]')
.prop('selected', 'selected');
}
</script>
4)最后在OrderController中更新功能,目前它可以更新主部件。但我不知道如何循环每个细节并在同一个函数中更新它们。
public function update(Request $request, $id)
{
//
$orderUpdate = $request->all();
$order = Order::find($id);
$order->update($orderUpdate);
return redirect('order');
}
答案 0 :(得分:6)
您可以选择两种方法:
如果您选择第二个选项,则需要在输入名称中添加[]
才能使该输入成为数组。实际上,您的输入上甚至没有名称,因此您的控制器永远不会收到该输入的值,因为它们不在POST变量中。
所以你需要这样的东西:
<input type="number" name="qty[]" id="ingQTY' + rowCount + '" value="' + ingQty + '"/>
name="qty[]"
在控制器端,您只需:
public function update(Request $request, $id)
{
// Update the order
$orderUpdate = $request->all();
$order = Order::find($id);
$order->update($orderUpdate);
// Go through all qty (that are related to the details, and create them)
foreach ($postValues['qty'] as $qty) {
$order->detail()->create([
'oid' => $order->id,
'total' => $qty,
]);
}
return redirect('order');
}
这应该让你知道你需要什么。当然,您应该提交订单详细信息ID并检查控制器是否存在该ID,并仅在该值存在时更新详细信息。如果它不存在,则表示您创建了详细信息。
我还要为订单明细(javascript部分)遗漏一些输入,因为该模型具有item
属性,您似乎无法创建输入那一栏。