php - 在 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!
解决方案
如果你问为什么数量列上的数量没有给你一个表格,或者为什么那个输入的返回不正确,我可以看到你有一些问题。第一个问题是您正在使用相同 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 的输入。
推荐阅读
- angular - 通过 SystemJS 导入子 Angular 应用程序时找不到模块错误
- python - 如何将 Pandas read_xml 设置为特定节点?
- ios - SwiftUI 中的照片未保存
- java - 由于缺少执行数据文件而跳过 JaCoCo 执行
- javascript - 如何在 SvelteKit 中创建简单的受保护路由?
- c - 从 c-object 文件中提取静态结构值,但 readelf 和 gdb 报告目标文件中的错误位置
- rest-assured - 放心:测试原始响应体的最佳方法是什么?
- html - 仅在 1 页中将样式应用于 div
- python - 如何减少 HoughLines 的闪烁?
- python - 如何遍历字典数组以仅将相关键复制到新字典?