Sails深度填充的变通方法



我正在尝试深入填充一个集合。

例如

// UnitType.js
name: { type: 'string' }
// Unit.js
unitType: {
  model: 'unitType',
  via: '_id',
  required: true,
  index: true
}
// Product.js
unit: {
  model: 'unit',
  via: '_id',
  required: true,
  index: true
},

问题是,据我从互联网研究中所知,像这样的深度人群

Product.find().populate('unit.unitType');

目前不支持帆。为了实现我想要的结果我目前

  • 查询带有填充unit的产品
  • 查询id为`product.unit.unitType的UnitTypes``
  • .map() product.unit.unitType与响应

这当然远非理想。我还尝试在模型中使用toJSON来"预填充"unitType->,但它不起作用,因为它不支持Promises。

关于这个问题,github上有很多关于so和PR的帖子,但到目前为止,我还没有找到这个问题的解决方案。有什么办法让这件事变得更好吗?

您可以尝试用Offshore ORM取代Waterline ORM。有一个钩子可以让帆钩在海上。

它很容易实现到您现有的项目中,因为它的Waterline分支有更多的功能。我发现的唯一缺点是帆钩验证停止工作。

如何安装

npm install sails-hook-orm-offshore --save

配置

.sailsrc

{
    "hooks": {
        "orm": false,
        "pubsub": false
    }
}

默认值

config/globals.js

adapters: true,
models: true

用法

现在,您将被允许在查询中进行深度填充。例如(来自文档):

User.find()
.populate('foo.bar', { name: 'foo' }) //populate foo into user and bar into foo
.exec(function(err, users) {
    console.log(users[0].foo.bar.name) // 'foo'
});

第二种选择

合并水线深度填充

npm i Atlantis-Software/waterline#deepPopulate

最新更新