使用 Eloquent Laravel 5 从视图中将 Cart::content() 插入多行

Insert Cart::content() into multiple Row From View Using Eloquent Laravel 5

如何在 Laravel 5.
中插入多行购物车:: content() 我正在为我的购物车使用 Crinsane/LaravelShoppingcart,但是,当您点击继续付款时,我希望用户填写客户详细信息,例如(终端 ID、销售日期和客户名称。但我遇到了问题将 Cart::(Content) 插入我的数据库(我不想插入实例。我喜欢将购物车分解为我的数据库列。例如,如果有人选择 2-5 件商品,我希望将其插入我的数据库, 每行中的每个项目。我已经在我的视图中分解了 Cart::content,但我需要能够使用 Laravel 来根据所选项目的数量插入多行。 请注意:如果我只将一件商品添加到购物车,我可以插入到数据库,只有当购物车中的商品多于一件时,我才会遇到问题。 下面是我的proceed.blade.php

 <div class="panel-heading">Customer Detail</div>
    <div class="panel-body">
       @if (sizeof(Cart::content()) > 0)
    {!! Form::open(['method'=>'POST', 'action'=> 'SalesController@store','files'=>true]) !!}
       {!! Form::text('counter', $counter=Cart::content()->groupBy('id')->count(),  ['class'=>'form-control'])!!}
        @foreach (Cart::content() as $item)
        <div class="form-group">
   {!! Form::label('product_name', 'Product Name:') !!}
  {!! Form::text('product_name', $item->name,  ['class'=>'form-control'])!!}                     </div>
          <div class="form-group">
    {!! Form::label('quantity', 'Quantity:') !!}
  {!! Form::text('quantity', $item->qty,  ['class'=>'form-control'])!!}
         </div>
       <div class="form-group">
  {!! Form::label('unit_price', 'Unit Price:') !!}
  {!! Form::text('unit_price', $item->price,  ['class'=>'form-control'])!!}
                     </div>
       <div class="form-group">
   {!! Form::label('rowId', 'Row ID:') !!}
   {!! Form::text('rowId', $item->rowId,  ['class'=>'form-control'])!!}
       </div>
    <div class="form-group">
           {!! Form::label('tax', 'Tax:') !!}
        {!! Form::text('tax', $item->tax,  ['class'=>'form-control'])!!}
           </div>
            <div class="form-group">
      {!! Form::label('total_price', 'Sub Total:') !!}
      {!! Form::text('total_price', $item->subtotal,  ['class'=>'form-control'])!!}
           </div>
          @endforeach

                     @endif
         <div class="form-group">
       {!! Form::label('terminal_id', 'Terminal ID:') !!}
       {!! Form::text('terminal_id', null, ['class'=>'form-control'])!!}
                       </div>
                       <div class="form-group">
       {!! Form::label('customer_name', 'Customer Name:') !!}
   {!! Form::text('customer_name', null,  ['class'=>'form-control'])!!}
                        </div>
                      <div class="form-group">
          {!! Form::label('sale_date', 'Sale Date:') !!}
         {!! Form::text('sale_date', null, ['class'=>'form-control'])!!}
                        </div>
                        <div class="form-group">
          {!! Form::submit('Check Out', ['class'=>'btn btn-primary']) !!}
                       </div>
         {!! Form::close() !!}
`

我的控制器

$counter= $request['counter'];
    for ($i = 0; $i < count($counter); $i++) {
Sale::create([
             'terminal_id' => $request['terminal_id'],
             'customer_name' => $request['customer_name'],
             'unit_price' => $request['unit_price'],
             'total_price' => $request['total_price'],
             'tax' => $request['tax'],
             'quantity' => $request['quantity'],
             'product_name' => $request['product_name'],
             'sale_date' => $request['sale_date'],
             'rowId' => $request['rowId']
    ]);

    }
    return redirect('shop');
}

首先,您的字段不是数组,因此对于您视图中的每个 @foreach,旧值将被覆盖。

通过这种方式更改您的视图,将您的输入输入数组:

<div class="panel-heading">Customer Detail</div>
<div class="panel-body">
@if (sizeof(Cart::content()) > 0)
{!! Form::open(['method'=>'POST', 'action'=> 'SalesController@store','files'=>true]) !!}
{!! Form::text('counter', $counter=Cart::content()->groupBy('id')->count(),  ['class'=>'form-control'])!!}
<?php $idx = 0; ?>
@foreach (Cart::content() as $item)
  <div class="form-group">
  {!! Form::label("product_name[$idx]", 'Product Name:') !!}
  {!! Form::text("product_name[$idx]", $item->name,  ['class'=>'form-control'])!!}
  </div>
  <div class="form-group">
  {!! Form::label("quantity[$idx]", 'Quantity:') !!}
  {!! Form::text("quantity[$idx]", $item->qty,  ['class'=>'form-control'])!!}
  </div>
  <div class="form-group">
  {!! Form::label("unit_price[idx]", 'Unit Price:') !!}
  {!! Form::text("unit_price[idx]", $item->price,  ['class'=>'form-control'])!!}
  </div>
  <div class="form-group">
  {!! Form::label("rowId[$idx]", 'Row ID:') !!}
  {!! Form::text("rowId[$idx]", $item->rowId,  ['class'=>'form-control'])!!}
  </div>
  <div class="form-group">
  {!! Form::label("tax[$idx]", 'Tax:') !!}
  {!! Form::text("tax[$idx]", $item->tax,  ['class'=>'form-control'])!!}
  </div>
  <div class="form-group">
  {!! Form::label("total_price[$idx]", 'Sub Total:') !!}
  {!! Form::text("total_price[$idx]", $item->subtotal,  ['class'=>'form-control'])!!}
  </div>
  <?php $idx++; ?>
@endforeach
@endif
<div class="form-group">
  {!! Form::label('terminal_id', 'Terminal ID:') !!}
  {!! Form::text('terminal_id', null, ['class'=>'form-control'])!!}
</div>
<div class="form-group">
  {!! Form::label('customer_name', 'Customer Name:') !!}
  {!! Form::text('customer_name', null,  ['class'=>'form-control'])!!}
</div>
<div class="form-group">
  {!! Form::label('sale_date', 'Sale Date:') !!}
  {!! Form::text('sale_date', null, ['class'=>'form-control'])!!}
</div>
<div class="form-group">
  {!! Form::submit('Check Out', ['class'=>'btn btn-primary']) !!}
</div>
{!! Form::close() !!}

我建议您也将 for 循环放入事务中以提高其安全性。

像这样:

public function store(SalesCreateRequest $request) {
  $counter = Input::get('counter');
  \DB::transaction(function() use ($counter){
    for ($i=0; $i < $counter; $i++){
      Sale::create([
        'terminal_id' => Input::get("terminal_id")[$i],
        'customer_name'=> Input::get("customer_name")[$i],
        'unit_price'=> Input::get("unit_price")[$i],
        'total_price'=> Input::get("total_price")[$i],
        'tax'=> Input::get("tax")[$i],
        'quantity'=> Input::get("quantity")[$i],
        'product_name'=> Input::get("product_name")[$i],
        'sale_date'=> Input::get("sale_date")[$i],
        'rowId'=> Input::get("rowId")[$i]
      ]);
    }
  });
  return "working";
}

注意您可以简单地在输入名称中添加一个 [] 后缀而不是 [$idx] 来制作您的输入数组,但通常会索引您的输入显式更安全。

Edit 来自 Cart::content()$idx 键返回了一个奇怪的数字,这就是简单数字抛出 Out of range exception 的原因。

像我上面那样更改您的视图代码,我希望以这种方式修复它。

希望对您有所帮助

只需修改您的控制器

$counter = $request['counter'];
\DB::transaction(function() use ($counter, $request) {
  for ($i = 0; $i < count($counter); $i++) {
   Sale::create([
   'terminal_id' => $request["terminal_id"],
   'customer_name' => $request["customer_name"],
   'unit_price' => $request["unit_price"][$i],
   'total_price' => $request["total_price"][$i],
   'tax' => $request["tax"][$i],
   'quantity' => $request["quantity"][$i],
   'product_name' => $request["product_name"][$i],
   'sale_date' => $request["sale_date"],
   'rowId' => $request["rowId"][$i]
  ]);
 }
});

注意

并非所有输入字段都是数组(terminal_id、sale_date...)