You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue+Laravel发票编辑:新增商品时数据结构不匹配报错

解决发票商品数据结构不一致导致的渲染报错

一、前端统一(Vue端处理)

1. 转换新增商品结构

从warehouse-products拿到扁平数据后,手动包装成和invoice_items一致的嵌套格式:

// 示例:把扁平商品数据转成嵌套结构
const flatProduct = await getWarehouseProducts(); // 假设这是接口返回的扁平数据
const formattedItem = {
  product: {
    id: flatProduct.id,
    name: flatProduct.name,
    sale_price: flatProduct.sale_price
    // 按需添加其他需要的product属性
  },
  quantity: 1 // 默认数量,根据业务调整
};
// 将formattedItem加入到发票商品列表
invoiceItems.value.push(formattedItem);

2. 模板兼容处理

如果不想改数据结构,直接在渲染时兼容两种结构,用可选链避免undefined报错:

<template>
  <table>
    <tr v-for="item in invoiceItems" :key="item.id">
      <td>{{ item.product?.name ?? item.name }}</td>
      <td>{{ item.product?.sale_price ?? item.sale_price }}</td>
      <!-- 其他列同理 -->
    </tr>
  </table>
</template>

低版本Vue(<2.6)不支持可选链,换成三元判断:item.product ? item.product.name : item.name

二、后端统一(Laravel端处理)

1. 调整warehouse-products接口返回嵌套结构

在Laravel控制器里,把扁平商品数据包装成嵌套格式:

// WarehouseProductController.php
public function search(Request $request)
{
    $products = WarehouseProduct::where('name', 'like', "%{$request->input('q')}%")->get();
    
    return response()->json([
        'data' => $products->map(function ($product) {
            return [
                'product' => $product->only(['id', 'name', 'sale_price']),
                'quantity' => 1 // 按需添加默认字段
            ];
        })
    ]);
}

2. 调整invoice_items接口返回扁平结构

如果更偏好扁平结构,把嵌套的product属性展开到顶层:

// InvoiceItemController.php
public function getInvoiceItems($invoiceId)
{
    $items = InvoiceItem::with('product')->where('invoice_id', $invoiceId)->get();
    
    return response()->json([
        'data' => $items->map(function ($item) {
            return array_merge(
                $item->only(['id', 'quantity']), // 保留发票商品自身字段
                $item->product->only(['id', 'name', 'sale_price']) // 展开product属性
            );
        })
    ]);
}

内容的提问来源于stack exchange,提问作者abdelghani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:19:57