如何构建 Ember 模型和 API 数据来表示关系数据?
How Do I Construct my Ember Models and API Data to represent data on the relationship?
我是 jsonapi 的新手,不知道结构是如何工作的,并试图建立关系以正确加载。我希望 ember-data 遵循提供的 url 在我的对象的 relationship.links 中获取所需的信息,但我得到了意想不到的结果。
我有用户、区域和定义如下的 User/Territory 关系:
// User Model
const UserModel = DS.Model.extend({
username: DS.attr('string'),
territories: DS.hasMany('user-territories')
}
// Territory Model
const TerritoryModel = DS.Model.extend({
name: DS.attr('string')
}
// User-Territory Model
const UserTerritoryModel = DS.Model.extend({
notes: DS.attr('string'),
startDate: DS.attr('date'),
user: DS.belongsTo('user'),
territory: DS.belongsTo('territory')
}
然后我有如下所示的模拟数据(使用 http-mock):
// api/users/
data: {
type: "users",
id: 1,
attributes: {
username: "thisIsMyUsername"
}
},
relationships: {
territories: {
links: {
self: "http://localhost:4200/api/users/1/territories"
}
}
}
// api/users/1/territories
data: {
type: "user-territories",
id: 1,
attributes: {
notes: "This is a note",
startDate: "2017-01-01"
}
},
relationships: {
user: {
link: {
self: "http://localhost:4200/api/users/1"
}
},
territory: {
link: {
self: "http://localhost:4200/api/territories/1"
}
}
}
// api/territories/1
data: {
type: "territories",
id: 1,
attributes: {
name: "Territory #1"
}
}
在我的 User 路由中,我想请求 UserModel 并访问 UserTerritory 关系数据和 Territory 本身。 api 调用不是我所期望的:
this.get('store').findRecord('user', 1, { include: "territories" });
预期:
- api/users/1
- api/users/1/领土
实际:
- api/users/1
- api/users/1?include=地区
如果我调用用户区域模型,我会得到:
预期:
- api/users/1/领土
实际:
- api/user-territories/1
如果你使用included
,ember-data基本上认为你想告诉服务器side-load数据。如果你return一个links
,就解决关系吧。但是 relationships
必须在 data
内。另外 self
link 是关系本身,return 数据使用 related
.
所以首先你做一些类似 user = store.findRecord('user', '1')
的事情,这将获取到 api/users/
。那么你应该 return 像这样:
// api/users/
{
data: {
type: "users",
id: 1,
attributes: {
username: "thisIsMyUsername"
}
relationships: {
territories: {
links: {
related: "http://localhost:4200/api/users/1/territories"
}
}
}
}
}
接下来你做 user.get('territories')
。这将 return 一个承诺,并获取 http://localhost:4200/api/users/1/territories
或相关 link 中的任何内容。但是要知道,ember-data
会期望你在这里 return user-territories
,因为那是你用 territories: DS.hasMany('user-territories')
指定的。您应该知道什么可以直接在 ember-data
中建立 many-to-many 关系模型,而无需第三个 table.
我是 jsonapi 的新手,不知道结构是如何工作的,并试图建立关系以正确加载。我希望 ember-data 遵循提供的 url 在我的对象的 relationship.links 中获取所需的信息,但我得到了意想不到的结果。
我有用户、区域和定义如下的 User/Territory 关系:
// User Model
const UserModel = DS.Model.extend({
username: DS.attr('string'),
territories: DS.hasMany('user-territories')
}
// Territory Model
const TerritoryModel = DS.Model.extend({
name: DS.attr('string')
}
// User-Territory Model
const UserTerritoryModel = DS.Model.extend({
notes: DS.attr('string'),
startDate: DS.attr('date'),
user: DS.belongsTo('user'),
territory: DS.belongsTo('territory')
}
然后我有如下所示的模拟数据(使用 http-mock):
// api/users/
data: {
type: "users",
id: 1,
attributes: {
username: "thisIsMyUsername"
}
},
relationships: {
territories: {
links: {
self: "http://localhost:4200/api/users/1/territories"
}
}
}
// api/users/1/territories
data: {
type: "user-territories",
id: 1,
attributes: {
notes: "This is a note",
startDate: "2017-01-01"
}
},
relationships: {
user: {
link: {
self: "http://localhost:4200/api/users/1"
}
},
territory: {
link: {
self: "http://localhost:4200/api/territories/1"
}
}
}
// api/territories/1
data: {
type: "territories",
id: 1,
attributes: {
name: "Territory #1"
}
}
在我的 User 路由中,我想请求 UserModel 并访问 UserTerritory 关系数据和 Territory 本身。 api 调用不是我所期望的:
this.get('store').findRecord('user', 1, { include: "territories" });
预期:
- api/users/1
- api/users/1/领土
实际:
- api/users/1
- api/users/1?include=地区
如果我调用用户区域模型,我会得到:
预期:
- api/users/1/领土
实际:
- api/user-territories/1
如果你使用included
,ember-data基本上认为你想告诉服务器side-load数据。如果你return一个links
,就解决关系吧。但是 relationships
必须在 data
内。另外 self
link 是关系本身,return 数据使用 related
.
所以首先你做一些类似 user = store.findRecord('user', '1')
的事情,这将获取到 api/users/
。那么你应该 return 像这样:
// api/users/
{
data: {
type: "users",
id: 1,
attributes: {
username: "thisIsMyUsername"
}
relationships: {
territories: {
links: {
related: "http://localhost:4200/api/users/1/territories"
}
}
}
}
}
接下来你做 user.get('territories')
。这将 return 一个承诺,并获取 http://localhost:4200/api/users/1/territories
或相关 link 中的任何内容。但是要知道,ember-data
会期望你在这里 return user-territories
,因为那是你用 territories: DS.hasMany('user-territories')
指定的。您应该知道什么可以直接在 ember-data
中建立 many-to-many 关系模型,而无需第三个 table.