在风帆水线

时间:2016-06-07 19:24:04

标签: postgresql waterline populate sails-postgresql

我创建了一个带有两个模型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命令,以获取工作表名称与某些键匹配的那些发布。

1 个答案:

答案 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)

或者,您可以将WorksheetPublication合并到一个模型中,因为它们是一对一的。可能不理想,但sails.js和Waterline使得处理关系数据变得非常困难 - 我估计我正在研究的项目中有一半的查询是原始查询,因为风帆对postgres的支持很差。该框架非常偏向于使用MongoDB although it claims to "just work" with any of the "supported" DBs