【问题标题】:Sequelize options.nest in query() method doesn't workquery() 方法中的 Sequelize options.nest 不起作用
【发布时间】:2021-09-15 12:00:24
【问题描述】:

我有一个原始查询,例如

squelize.query(
   `select "order".id, "orderCustomer".id as "orderCustomer.id", "orderCustomer".forename as "orderCustomer.forename" 
    from orders as "order"
    join customers as "orderCustomer" on "orderCustomer".id = "order"."orderCustomerId"
    where "orderCustomer".forename ilike '%petra%';`,
{
    type: Sequelize.QueryTypes.SELECT, 
    model: order,
    nest: true,
    mapToModel: true
})

当我在 psql 中查询时,我得到了正确的结果集:

-[ RECORD 1 ]----------+------
id                     | 383
orderCustomer.id       | 446
orderCustomer.forename | Petra
-[ RECORD 2 ]----------+------
id                     | 419
orderCustomer.id       | 9
orderCustomer.forename | Petra

问题是,Sequelize 显然无法将其形成一个数组

[
 {
   id: 383,
   orderCustomer: {
      id: 446,
      forename: 'Petra'
   }
 },
   ...
]

相反,我得到的是这样的:

[
 {
   id: 383,
   'orderCustomer.id': 446,
   'orderCustomer.forename': 'Petra'
 },
   ...
]

我需要include 查询选项对象中的客户模型吗?

更新

我记录了我的查询结果。所有返回的订单实例都有这个属性_options

_options:{ 
   isNewRecord: false,
   _schema: null,
   _schemaDelimiter: '',
   raw: true, // <--------- possible cause?
   attributes: undefined 
}

不知何故,我无法在我的查询定义中将options.raw 设置为false!也许这就是为什么……

...sequelize 不会尝试格式化查询结果,或根据结果构建模型实例(请参阅docs > query() > options.raw

有什么想法吗?

【问题讨论】:

  • 您好,我也面临同样的问题。你能解决这个问题吗?
  • @Sisir 不,抱歉。从那以后就没有研究过...

标签: javascript node.js postgresql sequelize.js


【解决方案1】:

我正在使用您的解决方案:nest: true 并且效果很好!

[err, rows] = await to(sequelize.query(query,{ replacements: { search: '%'+search+'%', limit: limit, offset: skip}, type: sequelize.QueryTypes.SELECT,nest: true}));

【讨论】:

    【解决方案2】:

    尝试不使用

    model: order,
    

    这帮我解决了

    【讨论】:

      【解决方案3】:

      现在是 2021 年,似乎这仍然不适用于 Sequelize 6.6.2。或者更确切地说,我不知道如何使 mapToModel 与嵌套属性一起工作。

      我通过删除 model: MyModel, mapToModel: true, 部分来解决此问题,以便查询选项如下所示:

      { type: QueryTypes.SELECT, bind: [mainAssetId], nest: true, raw: false }

      我用所有字段和嵌套作品取回对象,但它当然不是模型的实例。从数据的角度来看,它看起来像模型,所以只要您的模型上没有方法就可以了。

      您始终可以使用 class-transformer 包之类的东西将其转换为模型实例。

      【讨论】:

        【解决方案4】:

        假设您已正确设置模型,

        为什么不使用关联来查询它,而不是使用原始查询。 这样的事情应该会产生类似的结果

        Model.Order.findAll({
          where:{forename:{$iLike:'someString'}},
          attributes:[/*Columns to fetch*/]
          include:[{model:Model.Customer,attributes:[/*Columns to fetch*/]}]
        });
        

        IMO 也使用嵌套属性,不会跨返回多行。

        【讨论】:

        • 感谢您的回答。我的真实查询要复杂得多,有很多关节,而且我更容易直接查询。 nest 道具应该完全符合我的要求(请参阅 docs.sequelizejs.com/class/lib/…),但我没有:( 你对我上面的问题有解决方案的想法吗?
        • 我可以自己编写一个函数,将'dotted.property' 转换为dotted: {property}。但我想,也许有一种 Sequelize 方式……
        【解决方案5】:

        我遇到了同样的问题并以这种方式工作:

                sequelize.query(
                    `SELECT q.id, q.title, a.id AS "answers.id"
                       FROM questions q
                       JOIN answers a ON a.question_id = q.id`,
                        model: Question,
                        mapToModel: true,
                        nest: true,
                        raw: true,
                        type: sequelize.QueryTypes.SELECT }
                )
        

        【讨论】:

          猜你喜欢
          • 2016-09-04
          • 1970-01-01
          • 2019-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          • 1970-01-01
          相关资源
          最近更新 更多