[英]Laravel 5.2 update Eloquent Master Detail on same page
以下是我在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');
}
您有兩種方法可以完成這項工作:
如果您選擇第二個選項,則需要在輸入名稱中添加[]
以使該輸入成為一個數組。 實際上,您的輸入上甚至沒有名稱,因此您的控制器永遠不會收到該輸入的值,因為它們不存在於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
屬性,你似乎沒有為該列創建輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.