环回:在“hasMany”类型的关系表中添加数据

时间:2017-05-21 23:28:49

标签: json api loopbackjs

我有一张表示用户个人资料的表格。这个简介可以跟随其他人的个人资料。

这是我的profil.json

的一部分
"relations": {
 "followers": {
  "type": "hasMany",
  "model": "Profil",
  "foreignKey": "publisherId",
  "keyThrough": "subscriberId",
  "through": "Subscribing"
 },
 "subscribings": {
  "type": "hasMany",
  "model": "Profil",
  "foreignKey": "subscriberId",
  "keyThrough": "publisherId",
  "through": "Subscribing"
 },

这很好,但现在我想知道订阅个人资料的日期。

所以我更新了subscribing.json关系表以添加日期

 {
 "name": "Subscribing",
  "base": "PersistedModel",
  "idInjection": true,
 "options": {
   "validateUpsert": true
},
"properties": {
  "subscriptionDate": {
    "type": "date",
    "required": true,
    "default": "$now"
  }
},
"validations": [],
"relations": {
  "subscriber": {
    "type": "belongsTo",
    "model": "Profil",
    "as": "subscriber"
  },
  "publisher": {
    "type": "belongsTo",
    "model": "Profil",
    "as": "publisher"
  }
},
"acls": [],
"methods": {}

}

现在,我希望能够查询此配置文件的数据,同时可以在同一时间检索订阅日期。理想情况下,我会保持关系表不公开。 感谢

3 个答案:

答案 0 :(得分:0)

您可以使用“include”过滤器将关系数据添加到响应中。 因此,在您的情况下,这应该得到用户的'订阅':

Profil.find({include: 'subscribings'}, function() { /* ... */ });

答案 1 :(得分:0)

尝试手动添加订阅者。

首先,添加subscribing.json

旁边的内容
  "scope": {
    "include": [
      "subscriber"
    ]
  }

接下来,在profil.js中创建钩子观察者(我使用lodash进行映射,但您可以使用您喜欢的库)

Profil.observe('loaded', function(ctx, next){
  const Subscribing = Profil.app.models.Subscribing;

  Subscribing.find({
    where: {
      publisherId: ctx.data.id
    }
  }, function (err, subscribings) {
    if(err) return next(err)

    ctx.data.subscribings = _.map(subscribings, function(subscribing){
      return {
        date: subscribing.subscriptionDate,
        subscriber: subscribing.subscriber
      }
    });

    next();
  });
})

一切都好!如果您遇到问题,请尝试此操作并发表评论。

答案 2 :(得分:0)

@rigobcastro在回答中提到了一种方式。

或者,您需要创建一个新关系。

我们称之为SubscribingMetaData

在你的profile.json中,添加以下

 "subscribingMetaData": {
  "type": "hasMany",
  "model": "Subscribing",
  "foreignKey": "subscriberId"
 }

现在您可以将其包含在您的查询中,

Profil.find({include: ['subscribings', 'subscribingMetaData']}, function() { /* ... */ });

// process subscribingMetaData and map subscriptionDate with subscribings to get desired output.