在 query() 方法中 Sequelize options.nest 不起作用



我有一个原始查询,例如

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((>选项.raw(

有什么想法吗?

我正在使用您的解决方案:嵌套:真实,它运行良好!

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

尝试一下没有

model: order,

这为我解决了

现在是2021 年,似乎这仍然不适用于 续集6.6.2.或者更确切地说,我无法弄清楚如何使mapToModel与嵌套属性结合使用。

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

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

我用所有字段和嵌套作品返回对象,但它当然不是模型的实例。从数据角度来看,它看起来像模型,所以只要你的模型上没有方法,你应该没问题。

您始终可以使用类似class-transformer包的内容将其转换为模型实例。

假设您正确设置了模型,

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

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

此外,IMO 使用嵌套属性,不会跨多行返回俱乐部。

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

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 }
)

最新更新