【问题标题】:Laravel 5.2 update Eloquent Master Detail on same pageLaravel 5.2 在同一页面上更新 Eloquent Master Detail
【发布时间】:2016-07-14 09:28:04
【问题描述】:

这是我在 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中的更新功能,目前可以更新master部分。但我不确定如何循环每个细节并在同一函数中更新它们。

public function update(Request $request, $id)
{
    //
   $orderUpdate = $request->all();
   $order = Order::find($id);
   $order->update($orderUpdate);


   return redirect('order');        
}

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您有两种选择来完成这项工作:

    1. 您可以为每个 OrderDetail 项目发出请求(在这种情况下,您必须通过 ajax 发布值,并且可以保留控制器代码)
    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 属性,而您似乎没有为该列创建输入。

    【讨论】:

    • 谢谢,是的,我只是提出了我的代码试图做什么的一般概念。而你的回答给了我如何实施下一步的方向。
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2021-08-16
    • 2013-01-07
    • 2021-10-28
    • 2019-04-10
    相关资源
    最近更新 更多