【问题标题】:Insert Cart::content() into multiple Row From View Using Eloquent Laravel 5使用 Eloquent Laravel 5 将 Cart::content() 从视图中插入多行
【发布时间】:2017-06-22 20:45:39
【问题描述】:

如何在 Laravel 5 中插入多行购物车:: content()。
我正在为我的购物车使用 Crinsane/LaravelShoppingcart,但是,当您单击继续付款时,我希望用户填写客户详细信息,例如(终端 ID、销售日期和客户姓名。但我在插入购物车时遇到问题::(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');
}

【问题讨论】:

    标签: php laravel laravel-5 shopping-cart cart


    【解决方案1】:

    首先,您的字段不是数组,因此您认为每个 @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] 来创建输入数组,但通常显式索引输入更安全。

    编辑来自Cart::content()$idx 键返回一个奇怪的数字,这就是为什么简单的数字会抛出Out of range exception

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

    希望对你有帮助

    【讨论】:

    • 谢谢@ahmad,我在SalesController.php line 46: Undefined variable: counter. 中遇到了ErrorException ...。我在for 之前包含了 $counter = Input::get('counter'); -交易中的循环。我收到另一个错误Cannot use object of type Illuminate\Database\MySqlConnection as array。请帮忙!
    • 可能通过将 for 循环放在 \DB:transaction 块之外,问题应该会消失。如果要保留事务块,则需要像我在上面的答案中所做的那样,将use ($counter, $request) 添加到事务的闭包中。
    • @Thanks Ahmad,我已经尝试过您发送的内容我得到了 未定义的变量:计数器,所以我将 for-loop 放在了事务之外,但又出现了一个错误未定义变量:i。我在 \DB::transaction 之前添加了$counter = Input::get('counter');。但仍然出现错误Integrity constraint violation: 1048('插入salesterminal_idcustomer_nameunit_pricetotal_pricetaxquantityproduct_name,@98765434@4@98765434@4 , updated_at, created_at) 值 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', array(null, null, null, null, null, null, null , null, null,))
    • 你能把你的控制器的代码放上去吗?那里可能存在变量冲突。
    • public function store(SalesCreateRequest $request) { $counter = Input::get('counter'); \DB::transaction(function() use ($counter, $request){ for ($i=0; $i &lt; count($counter); $i++){ Sale::create([ 'terminal_id' =&gt;$request["terminal_id[$i]"], 'customer_name'=&gt;$request["customer_name[$i]"], 'unit_price'=&gt;$request["unit_price[$i]"], 'total_price'=&gt;$request["total_price[$i]"], 'tax'=&gt;$request["tax[$i]"], 'quantity'=&gt;$request["quantity[$i]"], 'product_name'=&gt;$request["product_name[$i]"], 'sale_date'=&gt;$request["sale_date[$i]"], 'rowId'=&gt;$request["rowId[$i]"] ]); }}); return "working";}
    【解决方案2】:

    只需修改你的控制器

    $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]
      ]);
     }
    });
    

    注意

    并非所有输入字段都是数组(终端 ID、销售日期...)

    【讨论】:

    • 仍然出现错误::SQLSTATE[23000]: 完整性约束违规: 1048 列 'terminal_id' 不能为空 (SQL: 插入sales (terminal_id, customer_name, unit_price , total_price, tax, quantity, product_name, sale_date, rowId, updated_at, created_at) 值 (, , , , , , , , 18, 2017-06-2 :08:54, 2017-06-28 19:08:54)).
    • 在 Connection.php 第 647 行的 Connection->runQueryCallback('插入sales (terminal_id, customer_name, unit_price, total_price, tax, discount , quantity, product_name, sale_date, rowId, updated_at, created_at) 值 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )',数组(空,空,空,空,空,空,空,空,空,空,'2017-06-28 19:08:54','2017-06-28 19:08:54' ), object(Closure)) 在 Connection.php 第 607 行
    • 得到错误:: SQLSTATE[23000]: 完整性约束违规: 1048 列 'unit_price' 不能为空 (SQL: 插入sales (terminal_id, customer_name, unit_price, total_price, tax, discount, quantity, product_name, sale_date, rowId, updated_at, created_at) 值 (10330101,-0,0,,,,2, 10-10, , 2017-06-28 20:05:18, 2017-06-28 20:05:18))。但是,在 MY VIEW TEXT 中,THE UNIT_PRICE 和其他文本字段不为空,但在错误中显示为空。
    • 我需要查看您的控制器并查看文件。您可以在 github 或任何合适的方式上分享。
    猜你喜欢
    • 2013-01-06
    • 2016-03-16
    • 1970-01-01
    • 2019-10-01
    • 2012-09-24
    • 2014-11-30
    • 2020-01-25
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多