我创建了一个带有两个模型Publication和Worksheet的Sails应用程序。他们有一对一的关系。 Sails-postgresql是我正在使用的适配器。我正在使用水线orm来向数据库发送查询。我正在尝试加载出版物数据和工作表,然后使用sort()根据工作表中的字段对记录进行排序我收到错误。
我的模特是:
Publication.js
module.exports = {
attributes: {
id: {
type: 'integer'
unique: true
},
worksheetId: {
type: 'integer',
model : 'worksheet'
},
status: {
type: 'string',
defaultsTo: 'active',
in : ['active', 'disabled'],
}
}
}
Worksheet.js
module.exports = {
attributes: {
id: {
type: 'integer',
unique: true
},
name: 'string',
orderWeight: {
type: 'integer',
defaultsTo: 0
}
}
}
所以现在我想加载状态为“活动”的所有发布,并在数据中填充工作表。
所以我正在执行查询:
Publication.find({
where: {
status: 'active'
}
})
.populate('worksheetId').limit(1)
.exec(function (error, publications) {
})
我得到的数据如下:
{
id : 1,
status : "active",
worksheetId : {
id : 1
name : "test",
orderWeight : 10
}
}
所以到现在为止一切正常。现在我想将限制增加到10并希望根据填充数据中的“orderWeight”对数据进行排序。最初,我根据发布ID和查询工作对整个数据进行了排序。
Publication.find({
where: {
status: 'active'
}
})
.populate('worksheetId').sort('id ASC').limit(10)
.exec(function (error, publications) {
})
所以我解雇了类似的查询来对“orderWeight”
上的数据进行排序Publication.find({
where: {
status: 'active'
}
})
.populate('worksheetId').sort('worksheetId.orderWeight ASC').limit(10)
.exec(function (error, publications) {
})
此查询给出了错误,即worksheetId.orderWeight不是发布表上的列。所以我想对不在发布表上的填充数据触发此排序查询。
请告诉我如何获得预期的结果。
除了sort()方法之外,我还想对填充的数据运行一些find命令,以获取工作表名称与某些键匹配的那些发布。
答案 0 :(得分:0)
基本上,您要做的是查询关联的属性。 This has been in the waterline roadmap since 2014, but it's still not supported,因此您必须找出解决方法。
一个选项是查询Worksheet
模型,并填充Publication
,因为sails不允许您在不使用原始查询的情况下跨模型进行查询(即.sort('worksheetId.orderWeight ASC')
不起作用)。不幸的是,您可能必须将active
标记移至Worksheet
。例如:
Worksheet.find({
status: 'active'
})
.populate('publication') // you should also add publication to Worksheet.js
.sort('orderWeight ASC')
.limit(10)
或者,您可以将Worksheet
和Publication
合并到一个模型中,因为它们是一对一的。可能不理想,但sails.js和Waterline使得处理关系数据变得非常困难 - 我估计我正在研究的项目中有一半的查询是原始查询,因为风帆对postgres的支持很差。该框架非常偏向于使用MongoDB although it claims to "just work" with any of the "supported" DBs。