首页 > 解决方案 > 在 laravel 中为接收部分交付的产品创造条件

问题描述

这是我尝试为我的应用程序“接收部分交付”的第二天。我在这里和各位大师碰碰运气。

我有这两个表,第一个是order_items表,

在此处输入图像描述

此表包含采购订单中的项目。另一个表是warehouse1

在此处输入图像描述

它持有部分接收的物品。

我明白了逻辑,我必须对warehouse1.order_item_id进行分组,以便我可以从order_number_id=22中获取项目的总和,这是order_items表中的id。给你看,这是我做 GROUP 的代码

public function viewdeliveryItems($id)
{
    $partialDeliveries = Warehouse1stocks::where('order_id', '=', $id)
       ->select(
                'order_item_id',
                DB::raw('SUM(stock_in_qty) as stock_in_qty'))->groupBy('order_item_id')->get();
                // DB::raw('SUM(stock_out_qty) as stock_out_qty'))->groupBy('order_item_id')->get();


    $order = Orders::find($id);
    $orderItems = $order->orderItems;


    $warehouse1stocks = Warehouse1stocks::all('order_id','order_item_id','stock_in_qty')->where('order_id','=',$id);

    return view('orders.delivery')->with('order', $order)
                                  ->with('warehouse1stocks', $warehouse1stocks)
                                  ->with('partialDeliveries', $partialDeliveries);
}

在我的代码中,您会看到我将order_item_id分组并还调用了订单商品,但您可以看到它们的唯一链接是ORDER_ID

只是为了向您展示雄辩的联系, 在 Orderitems 模型中

public function Warehouse1stocks()
{
    return $this->hasMany('App\Warehouse1stocks', 'id', 'order_item_id')->orderBy('created_at', 'DESC');
} 

Warehouse1stocks 模型

public function orderItems()
{
    return $this->hasMany('App\Orderitems', 'order_id', 'id')->orderBy('created_at', 'DESC');

}

在我的刀片中,正如我在介绍中提到的那样,我在将近 2 天的时间里完成了这项工作,我刚刚开始编写自己的代码,这就是为什么我依赖谷歌上提供的教程和建议中的大部分代码库,我想我已经尝试了太多方法,由于绝望,我最终得到了这个,

@foreach($order->orderItems as $key=>$orderItem)
<tr>
    <td>{{ $orderItem->product_code }}</td>
    <td>{{ $orderItem->product_name }}</td>

    <td>
    @foreach($partialDeliveries as $partialDelivery)

            @if($partialDelivery->order_item_id == $orderItem->id)
                @php
                $remainingDeliveries = $orderItem->quantity - $partialDelivery->stock_in_qty;
                @endphp                    
            @else
                @php
                $remainingDeliveries = $orderItem->quantity;
                @endphp
            @endif


                {!! Form::number('stock_in_qty[]', $remainingDeliveries, 
                                ['id'=>'stock_in_qty_'.$orderItem->id]) !!} 
    @endforeach
    </td>
    ....
</tr>
@endforeach

**注意:起初它在第一个 ForEach 的正下方有“@if($loop->first)”。我只是删除它。

解释 第一个 @foreach 调用 orderItems 表中的项目,第二个调用具有部分接收项目的(总和)数量的项目

从我的 if 条件来看,如果两个 order_item_id 相等,则触发计算。如果不是,那么只需从 order_items 表中获取数量。

但是这样做并没有给出我预期的结果。

为了给你一个想法,这是我的刀片的截图,

在此处输入图像描述

我知道我的帖子太长了,但我想我需要解释更多,希望你能理解这个场景。

大师们,我真的希望你们能帮助我。提前非常感谢你!!!

更新(已解决)

在挖掘了更多的北斗,并删除和添加了一些代码,最重要的是在遵循@Watercayman 的回答之后,我终于解决了它。对于其他也面临与我相同问题的人,这就是我所做的。

@if (isset($partialDeliveries[$key]))
    @foreach($partialDeliveries as $partialDelivery)
        @if($partialDelivery->order_item_id == $orderItem->id)
            @php
                $remainingDeliveries = $orderItem->quantity - $partialDelivery->stock_in_qty;
            @endphp
        @endif
    @endforeach
@endif
@if (!isset($partialDeliveries[$key]))
    @php
        $remainingDeliveries = $orderItem->quantity;
    @endphp
@endif

我不能解释一切,因为我不能:)

谢谢@Watercatman!

标签: phplaravelif-statementconditional-statements

解决方案


如果你问为什么数量列上的数量没有给你一个表格,或者为什么那个输入的返回不正确,我可以看到你有一些问题。第一个问题是您正在使用相同 ID 在同一空间中创建 n+1 个数字输入表单项。这可能会阻止它们出现,并且永远不会产生可用的形式。这:

{!! Form::number('stock_in_qty[]', $remainingDeliveries, 
                            ['id'=>'stock_in_qty_'.$orderItem->id]) !!} 

在您的内部 for 循环内。因此,对于$partialDelivery该循环中的每一个,您都在创建多个具有完全相同 id ( 'stock_in_qty_'.$orderItem->id) 的数字输入。

我不能代表 sql,因为我不知道什么是倾销,但它确实会帮助您$remainingDeliveries在控制器中进行计算。在较大的循环内<tr>循环可能不是正确或干净地进行计算的最简单方法。但是,如果您必须在刀片文件中执行此操作,请将数字输入移到 @foreach 循环之外,以便您只有一个带有一个 id 的输入。


推荐阅读