首页 > 解决方案 > 如何从与主表相同级别的sequelize中返回连接表的值

问题描述

我正在尝试找到一种方法如何将所有连接的表与我的主表放在同一级别......到目前为止,它只会导致我的最终对象中的嵌套值..

这是我所拥有的

Orders.findAll({
   include: [
      {model: Products, attributes: ['product_name']}
   ],
   attributes: ['id_order', 'dtime_order', 'amount']
})

我得到的是:

[
 {
   id_order: 1, 
   dtime_order: '2021-05-24T22:00:00.000Z',
   amount: 20,
   products: {
      product_name: 'Picture'
   }
 }
]

但我想要的是:

[
 {
   id_order: 1, 
   dtime_order: '2021-05-24T22:00:00.000Z',
   amount: 20,
   product_name: 'Picture'
 }
]

我试过这个How to return result from include model in the same level of main model in Sequelize? 但不幸的是,当我这样做时:

Orders.findAll({
   include: [
      {model: Products, attributes: []}
   ],
   attributes: ['id_order', 'dtime_order', 'amount', ['products.product_name', 'product_name']]
})

不适合我说

column "products.product_name" does not exist

在将对象发送回响应之前,可能有一种 hacky 方法来修改对象..但我宁愿在 Sequelize 中进行。

任何想法都非常受欢迎......谢谢你们!

编辑:添加生成的 SQL

Executing (default): SELECT "orders"."id_order", "orders"."dtime_order", "orders"."amount", "products.product_name", FROM "orders" AS "orders" LEFT OUTER JOIN "products" AS "products" ON "orders"."id_order" = "products"."ir_order";
error:   Get dashboard data error: column "products.product_name" does not exist

解决方案:

我不得不在我的协会中使用别名

Orders.hasOne(Products, {as: 'products', ....})

然后在我的包含和引用中使用完全相同的别名

include: [{model: Products, attributes: [], as: 'products'}]

attributes: [ ... , [Sequelize.col('products.product_name', 'product_name')]

没有raw: true像魅力一样的作品:)谢谢@Emma !!!

标签: javascriptnode.jssequelize.js

解决方案


请使用Sequelize.col包裹嵌套列,以便 Sequelize 可以正确地为该列起别名。

Orders.findAll({
  include: [
    {model: Products, attributes: []}
  ],
  attributes: ['id_order', 'dtime_order', 'amount', [Sequelize.col('products.product_name'), 'product_name']],
  raw: true
})

推荐阅读