Laravel查询指定ID集合的stock记录,无匹配时返回0用于datatable展示
解决方案
核心思路是先把符合条件的库存记录映射为ID为键的查找数组,再遍历你需要输出的全部ID数组,逐个匹配取值,无匹配则取0,保证所有ID都有对应输出,顺序和原ID数组完全一致。
修改后的Blade代码
<td class="border-t border-gray-200 border-dashed"> @php $paperorderids = []; $paperorder = $item->paperorders->where('paperorder_id', $item->id); foreach ($paperorder as $key => $value) { $paperorderids[] = $value->id; } // 把符合条件的库存转为[paperorder_papers_id => qty]的映射数组 $stockMap = $item->stocks ->where('status', 'qc-pass') ->whereIn('paperorder_papers_id', $paperorderids) ->keyBy('paperorder_papers_id') ->map(fn($stock) => $stock->qty ?? 0) ->toArray(); @endphp @foreach($paperorderids as $id) <span class="flex items-center px-6 py-0 text-gray-700"> {{ $stockMap[$id] ?? 0 }} </span> @endforeach </td>
代码说明
- 使用Laravel集合的
keyBy方法,把符合条件的库存记录以paperorder_papers_id为键重组,查找效率远高于嵌套循环 - 直接遍历你需要展示的所有ID数组,保证每个ID都有对应的输出项,不会出现缺失
- 用
?? 0做默认值兜底,不管是记录不存在还是qty为空,都统一展示0
优化建议
建议把这部分数据处理逻辑移到控制器中完成,Blade模板只负责渲染最终数据,代码可维护性更高。
内容的提问来源于stack exchange,提问作者Madushan Serasinghe
相关产品推荐
相关产品推荐

