如何在Prisma中建立两张表的关联并编写有效的查询语句?
Logistics与Stores关联查询实现方案
先确认你的Prisma模型已经正确建立了一对多关联:一个Stores可以对应多条Logistics记录,一条Logistics属于一个Stores,这个关联逻辑是没问题的。
接下来看你的API代码,有两个小细节需要调整,才能完美满足「获取Logistics全列数据+对应匹配storeid的Stores数据」的需求:
1. 补全storeid的获取逻辑
原代码里的storeid没有从请求中读取,你需要根据API的传参方式(比如URL查询参数、请求体)拿到这个值,示例中我们假设用URL查询参数传递。
2. 修正关联数据的包含语法
Prisma的include选项需要明确指定关联字段的包含规则,这里应该用Stores: true来声明要包含关联的Stores数据(ES6的简写{ Stores }在这里不生效,Prisma需要键值对形式的配置)。
修正后的完整API代码
export default async function handle(req, res) { await runMiddleware(req, res, cors); try { // 从URL查询参数中获取storeid,若你用请求体传参可改为req.body.storeid const { storeid } = req.query; // 先校验参数,避免空查询或无效请求 if (!storeid) { return res.status(400).json({ error: "storeid参数不能为空" }); } const logistics = await prisma.logistics.findMany({ // 筛选指定storeid的Logistics记录,注意转换类型(Stores.storeid是Int类型) where: { logistics_store: parseInt(storeid) }, include: { // 包含关联的Stores完整数据 Stores: true } }); res.json(logistics); } catch (error) { console.error("查询出错:", error); res.status(500).json({ error: "服务器内部错误" }); } }
关键说明
- 类型转换:因为
Stores.storeid是Int类型,而从请求中获取的参数默认是字符串,必须用parseInt()转换类型,否则会出现查询不匹配的问题。 - 关联数据自动匹配:当你使用
include: { Stores: true }时,Prisma会自动通过logistics_store与storeid的关联关系,返回每条Logistics对应的Stores数据,不需要额外给Stores加筛选条件。 - 错误处理优化:添加了参数校验和友好的错误返回,让API的鲁棒性更强,客户端能快速定位问题。
返回结果示例
最终返回的JSON结构大概是这样的:
[ { "logisticsid": "LOG001", "logistics_store": 1, "logistics_date": "2024-05-20T10:00:00.000Z", "Stores": { "storeid": 1, "ka": 100, "country": "CN", "name": "北京门店", "city": "北京", "address": "朝阳区XX路", "kgrp_name": "零售组", "password": "xxx", "cxw": 5, "cx": 3, "plz": 100000 } } ]
内容的提问来源于stack exchange,提问作者GoOsT
相关产品推荐
相关产品推荐

