AdonisJs如何实现嵌套关联预加载invoiceDetails.product
解决方案
AdonisJS的ORM预加载原生支持嵌套关联查询,有两种常用实现方式:
方式1:点语法(和Laravel用法一致,适合无额外查询条件的场景)
直接在preload方法中传入用.拼接的多级关联名即可,修改你的查询代码如下:
const invoice = await Invoice .query() .preload('invoiceDetails.product') // 嵌套预加载明细关联的商品数据 .where('id', request.param('id')) .firstOrFail()
方式2:回调函数写法(适合需要对子关联添加自定义查询条件的场景)
如果需要给invoiceDetails或者product的查询增加筛选、指定返回字段等逻辑,可以用回调嵌套的写法:
const invoice = await Invoice .query() .preload('invoiceDetails', (detailQuery) => { // 可在这里给发票明细加查询条件,示例:过滤掉已删除的明细 detailQuery.whereNull('deleted_at') // 嵌套预加载商品,也可以给商品加查询条件 detailQuery.preload('product', (productQuery) => { // 示例:只返回商品的id、名称、售价三个字段 productQuery.select('id', 'name', 'price') }) }) .where('id', request.param('id')) .firstOrFail()
两种方式都能拿到嵌套的product数据,无自定义查询需求时优先用第一种点语法即可,写法更简洁。
内容的提问来源于stack exchange,提问作者Stack Team
相关产品推荐
相关产品推荐

