[英]Can't use attributes with sequelize.fn inside include block of findAll query
[英]Error: Tried to select attributes using Sequelize.cast or Sequelize.fn without specifying an alias for the result, during eager loading
数据:一个Office
有许多OfficeLocations
,每个Office
都有许多Ratings
。 我需要编写一个查询时,只获取Offices
,有在免得一个Rating
。 我的查询:
let condition = {
include: [{
model: OfficeLocation.unscoped(),
attributes: [
'"Office"."id" as "Office.id"',
'"OfficeLocations"."id" AS "OfficeLocation.id"'
],
include: [
{
model: Rating.unscoped(),
attributes: [
'*',
sequelize.fn('COUNT', sequelize.col('"OfficeLocations->Ratings"."id"'))
]
}
],
group: '"Office.id", "OfficeLocation.id"',
having: sequelize.where(
sequelize.fn('COUNT', sequelize.col('"OfficeLocations->Ratings"."id"')),
'>',
0
)
}]
}
Office.findAll(condition).then(data => {
res.send(data);
}).catch(e => {
console.log(e);
});
但是我在控制台中出错:
Error: Tried to select attributes using Sequelize.cast or Sequelize.fn without specifying an alias for the result, during eager loading. This means the attribute will not be added to the returned instance
at include.attributes.map.attr (/Users/.../node_modules/sequelize/lib/dialects/abstract/query-generator.js:1307:17)
at Array.map (<anonymous>)
at Object.generateInclude (/Users/.../node_modules/sequelize/lib/dialects/abstract/query-generator.js:1287:52)
at Object.generateInclude (/Users/.../node_modules/sequelize/lib/dialects/abstract/query-generator.js:1355:39)
我也尝试过
where: sequelize.literal('COUNT(DISTINCT(`OfficeLocations`.`Ratings`.`id`)) > 0'),
而不是属性/组/具有属性,但是它也不起作用。
谢谢。
更新
此SQL查询可根据需要运行:
sequelize.query(`
SELECT
"Office"."id" as "Office.id",
"Office"."name",
"Office"."website",
"OfficeLocations"."id" AS "OfficeLocations.id",
COUNT("OfficeLocations->Ratings"."id") as "RatingsCount"
FROM "Companies" AS "Office"
LEFT OUTER JOIN ( "OfficeLocations" AS "OfficeLocations"
INNER JOIN "Ratings" AS "OfficeLocations->Ratings"
ON "OfficeLocations"."id" = "OfficeLocations->Ratings"."OfficeLocationId"
)
ON "Office"."id" = "OfficeLocations"."OfficeId"
GROUP BY "Office.id", "OfficeLocations.id"
HAVING COUNT("OfficeLocations->Ratings"."id") > 0
`)
除了我要获取所有数据。
请参阅Model.findAll语法了解options
参数。
group
和having
options
对象的属性。 attributes
选项)的别名,请使用数组: [expr, alias]
。 attributes.include
和/或attributes.exclude
数组。 include[].attributes
选项以供参考,以包含的Model的属性。 include[].required
选项在INNER和OUTER JOIN之间选择。 您的情况:
let options = {
include: [
{
model: OfficeLocation,
required: false, //false for OUTER JOIN, but I think that you can use INNER JOIN
attributes: [
"id", //this is OfficeLocation.id, see 4th item above.
[Sequelize.fn("COUNT", Sequelize.col('`OfficeLocations->Ratings`.`id`')), "RatingsCount"]
],
include: [
{
model: UserRating,
attributes: [],
required: true
}
]
}
],
group: [
`Office.id`,
`OfficeLocations.id`
],
having: Sequelize.where(Sequelize.fn("COUNT", Sequelize.col('`OfficeLocations->Ratings`.`id`')), ">", 0)
};
请注意,由Sequelize生成的别名可能会更改,因此您应该为Sequelize.col
更新它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.