簡體   English   中英

Laravel 5.2在同一頁面上更新Eloquent Master Detail

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

您有兩種方法可以完成這項工作:

  1. 您要么為每個OrderDetail項目發出請求(在這種情況下,您必須通過ajax POST值,並且您可以保留您的控制器代碼)
  2. 或者您創建一組輸入,一次提交所有數據,並在服務器上處理這些輸入。

如果您選擇第二個選項,則需要在輸入名稱中添加[]以使該輸入成為一個數組。 實際上,您的輸入上甚至沒有名稱,因此您的控制器永遠不會收到該輸入的值,因為它們不存在於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM