5

我正在使用环回进行 API 设计和数据建模。我使用 MySQL 作为我的数据库。尽管我的 API REST URL 成功返回了结果,例如/states/{id}/cities. 我有以下模型,但似乎没有添加外键关系。以下是我的模型定义。

"state": {
  "options": {
    "relations": {
      "cities": {
        "type": "hasMany",
        "model": "city",
        "foreignKey": "stateId"
      }
    }
  },
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "public": true,
  "dataSource": "db",
  "plural": "states"
},
"city": {
  "options": {
    "relations": {
      "state": {
        "type": "belongsTo",
        "model": "state",
        "foreignKey": "stateId"
      }
    }
  },
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "public": true,
  "dataSource": "db",
  "plural": "cities"
}

下面是城市表的截图。 在此处输入图像描述

以下是状态表截图。 在此处输入图像描述

我可能在这里做错了。期待任何指针。

4

2 回答 2

3

似乎 Loopback 使用“WHERE”查询而不是基于关系来处理模型中的关系。以下是详细信息。

https://github.com/strongloop/loopback-connector-mysql/issues/16

于 2014-01-08T04:53:42.107 回答
3

loopback-mysql-connector 支持在模型定义文件中使用automigrateautoupdate结合键向 MySQL DB 添加外键。foreignKeys但是由于缺乏文档,人们没有意识到这个功能。

在我与他们讨论后,他们更新了文件。请再次检查他们的自述文件:https ://github.com/strongloop/loopback-connector-mysql#auto-migration

简而言之,您的代码应该是:

bin/automigrate.js

var path = require('path');

var app = require(path.resolve(__dirname, '../server/server'));
var ds = app.datasources.db;
ds.autoupdate(null, function(err) {
  if (err) throw err;
  console.log('Finished migration');
  ds.disconnect();
});

common/models/book.json

{
  "name": "Book",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "name": {
      "type": "string"
    }, "isbn": {
      "type": "string"
    },
  },
  "validations": [],
  "relations": {
    "author": {
      "type": "belongsTo",
      "model": "Author",
      "foreignKey": "authorId",
      "primaryKey": "id"
    }
  },
  "acls": [],
  "methods": {},
  "foreignKeys": {
    "authorId": {
      "name": "authorId",
      "foreignKey": "authorId",
      "entityKey": "id",
      "entity": "Author"
    }
  }
}

然后运行迁移脚本来创建/更新数据库表(它们将有外键):

node bin/automigrate.js
于 2017-06-17T08:52:40.873 回答