关联

本页内容

关联连接两个集合,并拥有其条目之间的链接:文章的作者、课程的章节、产品的相关产品。reference 字段从一端查看一个关联,并为编辑者提供选择器。

因为关联拥有链接,它的两个集合都可以编辑同一组链接。slug、每一侧的名称,以及每一侧可链接多少条目的上限都属于关联,因此 posts 上的字段与 authors 上的字段不能对同一组链接产生分歧。EmDash 将链接存储在两个集合表之外,按每个条目的翻译组作为键,因此条目的每个翻译共享同一选择。

两端分别是链接侧与被链接侧。在从 posts 到 authors 的关联中,posts 上的字段挑选文章所链接的作者,authors 上的字段列出链接到它的文章。

添加关联

两个内容类型必须先存在,才能连接它们。

  1. 在管理后台打开 Content Types,然后打开 Relations。

  2. 点击 New Relation,然后选择两个内容类型。Links from 是挑选的一侧;Links to 是被挑选的一侧。

  3. 在 Roles 下,用复数与单数命名每一侧。名称从内容类型预填,可以编辑。引用字段采用它所挑选的那一侧的名称。

  4. 检查 Slug。它跟随名称,引用字段会存储它。

  5. 在 How many 下,设置每一侧的上限:One、Any number,或带你指定 Maximum 的 At most。绑定到该关联的两个字段共享这些上限。

  6. 创建关联。

关联一旦存在,两个内容类型与 slug 即固定。每个链接按关联作为键,因此移动一端会把已存链接指向错误类型的内容。要连接不同的内容类型,请创建另一个关联。

名称与上限仍可编辑。降低上限会保留现有链接;若条目的选择超过新上限,保存会被拒绝,直到选择符合为止。

内容类型自己的页面会在其字段下的 Relations 面板中列出它作为一端的关联。新建、编辑与删除在那里同样可用。

添加引用字段

  1. 在 Content Types 下打开内容类型,点击 Add Field。

  2. 选择 Reference。

  3. 选择要绑定的关系。最后一项 Create relation 会在同一对话框中打开关系表单,并在返回时选中新建的关系;在尚无关联的站点上,它是唯一选项。

  4. 对于两端为同一内容类型的关系,将 This field picks 设为 Entries this one links to 或 Entries that link to this one。其他情况下,字段自身的内容类型决定端点,字段从另一端挑选条目。

  5. 检查标签与 slug。标签来自字段所挑选的一侧,之后重命名字段会重命名关系的那一侧。

  6. 添加字段。

一个关联每端只接受一个字段,因此同一端的第二个字段会被拒绝:两个选择器写入同一组链接没有确定结果。要让两个内容类型都能编辑同一组链接,请在同一关联的两端各添加一个字段。

引用字段不能标记为 searchable 或 indexed,因为它不存储自己的列。内容列表筛选与站点搜索不覆盖它。

在编辑器中挑选条目

该字段在条目编辑器中呈现为选择器。Add reference 打开对引用内容类型的搜索;限制为一个条目的字段在已有一个时提供 Replace reference。每个已选条目可在新标签打开、移除,或在挑选被链接侧的字段上上下移动,以设定模板读取它们的顺序。挑选链接侧的字段列出链接到本条目的条目,它们没有自己的顺序。

选择与条目一起在一次请求中保存。在保留修订的集合上,更改已发布条目的选择会与条目的其他待定编辑一起暂存在草稿中:条目发布时生效,并随草稿丢弃。条目预览会显示暂存的选择。

查看什么链接到某条目

在关系的另一端添加引用字段。挑选链接侧的字段列出链接到本条目的条目,因此编辑页面的作者可以看到指向它的文章,并可从任一端更改该集合。

在模板中读取链接

引用字段不是条目 data 的一部分。在 references 选项中命名页面要渲染的字段,每个都会以一页条目返回:

---
import { getEmDashEntry } from "emdash";

const { entry: post } = await getEmDashEntry("posts", Astro.params.slug, {
  references: { author: true },
});

const author = post?.references?.author.entries[0];
---

<h1>{post?.data.title}</h1>
{author && <p>By {author.data.name}</p>}

读取引用字段 涵盖分页、预览行为、生成类型,以及每次调用的查询成本。

在种子中声明关联

种子文件 在顶层 relations 数组中声明关联,引用字段按 slug 绑定到其中一个。改为命名 targetCollection 的字段会为其创建关联。emdash export-seed 输出站点的关联,--with-content 输出每个条目的链接,因此站点的选择能在导出与重新应用后保留。

删除字段或关联

删除引用字段时会提议同时删除它使用的关系,并说明会带走什么:关系、其下存储的链接,以及另一内容类型上的字段。取消勾选可保留关系及其链接,例如当另一端的字段仍在使用它们时。

删除关系总会移除其链接及绑定到它的字段。删除内容类型会移除它作为一端的每个关系,以及查看它们的其他内容类型上的字段;确认列表会列出它们。

绑定尚无关联的字段

没有关联的引用字段在文本框中保存一个条目 ID,而不是挑选条目。为其提供关联即可变为选择器。

  1. 在 Content Types 下打开内容类型,点击字段行上的编辑操作。

  2. 选择 Referenced collection,若字段应保存多个条目,则设置 Allow multiple references。

  3. 保存字段。

EmDash 会创建以字段及其内容类型命名的关联,将字段列中保存的条目 ID 复制为链接,并清除字段的 searchable 与 indexed 标志,使内容列表筛选与站点搜索不再覆盖它。关联对另一方向回链多少条目不设上限。列仍保留且不再写入;在 Relations 页面编辑关联以重命名两侧或设置第二个上限。

从早期版本更新的站点可能仍有处于此状态的字段。参见引用字段绑定到关联,了解更新会绑定什么、又留给你什么。