通过 REST API 管理关系
定义内容类型之间的关系(在数据库层中指定为实体)就是将实体相互连接。
可以通过 管理面板 或通过发送到 Content API 的 REST 请求来管理内容类型之间的关系。
可以通过在请求正文中传递参数,通过 Content API 连接、断开或设置关系:
参数名称 | 说明 | 更新类型 |
---|---|---|
connect | 连接新实体。 可以与 disconnect 结合使用。可以与 位置参数 一起使用,以定义关系的顺序。 | 部分 |
disconnect | 断开实体。 可与 connect 结合使用。 | 部分 |
set | 将实体设置为特定集合。使用 set 将覆盖与其他实体的所有现有连接。不能与 connect 或 disconnect 结合使用。 | 完整 |
connect
在请求正文中使用 connect
执行部分更新,连接指定的关系。
connect
接受简写或全写语法。在以下示例中,数字表示实体 ID:
语法类型 | 语法示例 |
---|---|
简写 | connect: [2, 4] |
全写 | connect: [{ id: 2 }, { id: 4 }] |
您还可以使用普通语法来重新排序关系。
connect
可以与 disconnect
结合使用。
connect
不能用于媒体属性(有关更多详细信息,请参阅 Upload 插件文档)。
简写语法示例
Sending the following request updates the restaurant
entity with id
1
, using the categories
attribute to connect the entity with entities with id
2
and 4
:
PUT
http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"connect": [2, 4]
}
}
}
const fetch = require('node-fetch')
const response = await fetch(
'http://localhost:1337/api/restaurants/1',
{
method: 'put',
body: {
data: {
categories: {
connect: [2, 4]
}
}
}
}
)
普通语法示例
发送以下请求会更新“id”为“1”的“restaurant”实体,并使用“categories”属性将该实体与“id”为“2”和“4”的实体连接起来:
PUT
http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"connect": [
{ "id": 2 },
{ "id": 4 }
]
}
}
}
const fetch = require('node-fetch')
const response = await fetch(
'http://localhost:1337/api/restaurants/1',
{
method: 'put',
body: {
data: {
categories: {
connect: [
{ id: 2 },
{ id: 4 }
]
}
}
}
}
)
关系重新排序
可以将位置参数传递给 connect
的普通语法来定义关系的顺序。
普通语法接受一个对象数组,每个对象包含要连接的条目的 id
和一个可选的 position
对象来定义连接关系的位置。
本文档中描述的语法适用于一对多、多对多和多向关系。
对于一对一、多对一和单向关系,语法也受支持,但只会使用最后一个关系,因此最好使用较短的格式(例如:{ data: { category: 2 } }
,请参阅 REST API 文档)。
要定义关系的 position
,请传递以下 4 种不同位置属性之一:
参数名称和语法 | 说明 | 类型 |
---|---|---|
before: id | 将关系定位在给定 id 之前。 | 条目 id |
after: id | 将关系定位在给定 id 之后。 | 条目 id |
start: true | 将关系定位在现有关系列表的开头。 | 布尔值 |
end: true | 将关系定位在现有关系列表的末尾。 | 布尔值 |
position
参数是可选的,默认为 position: { end: true }
。
由于 connect
是一个数组,因此操作的顺序很重要,因为它们将按顺序处理(参见下面的组合示例)。
同一关系不应连接多次,否则 API 将返回验证错误。
基本示例
考虑数据库中的以下记录:
{
"categories": [
{ "id": 1 },
{ "id": 2 }
]
}
发送以下请求将更新“id”为“1”的“restaurant”实体,将“categories”属性的“id”为“3”的实体关系连接起来,并将其定位在“id”为“2”的实体之前:
PUT http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"connect": [
{ "id": 3, "position": { "before": 2 } }
]
}
}
}
组合示例
考虑数据库中的以下记录:
{
"categories": [
{ "id": 1 },
{ "id": 2 }
]
}
在 PUT 请求的请求正文中发送以下示例可更新多个关系:
PUT http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"connect": [
{ "id": 6, "position": { "after": 1 } },
{ "id": 7, "position": { "before": 2 } },
{ "id": 8, "position": { "end": true } },
{ "id": 9 },
{ "id": 10, "position": { "start": true } }
]
}
}
}
省略 position
参数(如 id: 9
)默认为 position: { end: true }
。所有其他关系都相对于另一个现有 id
(使用 after
或 before
)或相对于关系列表(使用 start
或 end
)进行定位。操作按照 connect
数组中定义的顺序依次处理,因此生成的数据库记录将如下所示:
{
"categories": [
{ "id": 10 },
{ "id": 1 },
{ "id": 6 },
{ "id": 7 },
{ "id": 2 },
{ "id": 8 },
{ "id": 9 }
]
}
disconnect
在请求主体中使用 disconnect
可执行部分更新,断开指定的关系。
disconnect
接受简写或全写语法。在以下示例中,数字表示实体 ID:
语法类型 | 语法示例 |
---|---|
简写 | disconnect: [2, 4] |
全写 | disconnect: [{ id: 2 }, { id: 4 }] |
disconnect
可与 connect
结合使用。
简写语法示例
Sending the following request updates the restaurant
entity with id
1
, disconnecting the relations with entities with id
2
and 4
:
PUT http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"disconnect": [2, 4]
}
}
}
普通语法示例
发送以下请求将更新 id 为 1 的餐厅实体,断开与 id 为 2 和 4 的实体的关系:
PUT http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"disconnect": [
{ "id": 2 },
{ "id": 4 }
]
}
}
}
set
使用 set
执行完全更新,按照指定的顺序用指定的关系替换所有现有关系。
set
接受简写或全写语法。在以下示例中,数字指的是实体 ID:
语法类型 | 语法示例 |
---|---|
简写 | set: [2, 4] |
全写 | set: [{ id: 2 }, { id: 4 }] |
由于 set
替换所有现有关系,因此不应与其他参数结合使用。要执行部分更新,请使用 connect
和 disconnect
。
省略任何参数等同于使用 set
。例如,以下 3 种语法都是等效的:
data: { categories: { set: [{ id: 2 }, { id: 4 }] }}
data: { categories: { set: [2, 4] }}
data: { categories: [2, 4] }
(就像在 REST API 文档中一样)
简写语法示例
发送以下请求将更新 id 为 1 的 restaurant 实体,替换所有先前存在的关系,并使用 categories 属性将该实体与 id 为 2 和 4 的实体连接起来:
PUT http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"set": [2, 4]
}
}
}
普通语法示例
发送以下请求将更新 id 为 1 的 restaurant 实体,替换所有先前存在的关系,并使用 categories 属性将该实体与 id 为 2 和 4 的实体连接起来:
PUT http://localhost:1337/api/restaurants/1
{
"data": {
"categories": {
"set": [
{ "id": 2 },
{ "id": 4 }
]
}
}
}