如何使用环回自我关系实现递归连接?

时间:2016-02-16 08:11:10

标签: javascript json node.js loopbackjs strongloop

如何使用strongloop中的自联接创建父子层次结构。我已将模型名称创建为菜单。

  

menu.json

{
  "name": "Menu",
  "base": "PersistedModel",
  "strict": false,
  "idInjection": false,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "MenuID": {
      "type": "Number",
      "id": true,
      "required": true
    },
    "Name": {
      "type": "string"
    },
    "ParentMenuID": {
      "type": "Number"
    }
  },
  "validations": [],
  "relations": {

    "menus": {
      "type": "hasMany",
      "model": "Menu",
      "foreignKey": "ParentMenuID",
    }
  },
  "acls": [],
  "methods": {}
}
  

表数据如:

menuId  Name     ParentID
1       parent      0
2       child       1
3      grandchild   2   

我尝试使用过滤器调用REST API,但是我得到了一个级别的数据 http://localhost:3000/api/Menus/?filter[include]=menus

 [
  {
    "MenuID": 1,
    "Name": "parent",
    "ParentMenuID": 0,
    "menus": [
      {
        "MenuID": 2,
        "Name": "child",
        "ParentMenuID": 1
      }
    ]
  },
  {
    "MenuID": 2,
    "Name": "child",
    "ParentMenuID": 1,
    "menus": [
      {
        "MenuID": 3,
        "Name": "grandchild",
        "ParentMenuID": 2
      }
    ]
  },
  {
    "MenuID": 3,
    "Name": "grandchild",
    "ParentMenuID": 2,
    "menus": []
  }
]

但是我需要输出:

[
  {
    "MenuID": 1,
    "Name": "parent",
    "ParentMenuID": 0,
    "menus": [
      {
        "MenuID": 2,
        "Name": "child",
        "ParentMenuID": 1,
        "menus": [
          {
            "MenuID": 3,
            "Name": "grandchild",
            "ParentMenuID": 2
          }
        ]
      }
    ]
  }
]

请提出任何想法或示例。

2 个答案:

答案 0 :(得分:1)

使用slc loopback:model创建模型后,只需运行slc loopback:relation并将selfjoin创建为关系。

正如您现在在更新的问题中所做的那样。要包含其他人,请使用include filterhttp://localhost:3000/api/Menus/?filter[include]=menus并包含两个级别,您可以这样做:http://localhost:3000/api/Menus/?filter[include][menus]=menus

答案 1 :(得分:0)

假设您有一个模型评论,图像以及它们之间想要的关系,那么评论应该有多个图像。然后你必须在两个模型的json文件中定义这种关系

Review.json
  "relations": {
    "images": {
      "type": "hasMany",
      "model": "Image",
      "foreignKey": ""
    }
  }

Image.json
  "relations": {
    "hotelReview": {
      "type": "belongsTo",
      "model": "HotelReview",
      "foreignKey": ""
    }
}

创建两个模型后,您也可以使用slc loopback:relation完成相同的操作。

现在,为了使用此关系或连接提取数据,您可以使用loopback提供的过滤器api,特别是使用环回提供的include

环回的示例链接包括和过滤api

https://docs.strongloop.com/display/public/LB/Include+filter https://docs.strongloop.com/display/public/LB/Querying+data

示例过滤器api,使用include: -

localhost:3000/api/Review?filter[where][email]=xyz@abc.com&filter[include]=images