關聯

本頁內容

關聯連接兩個集合,並擁有其條目之間的連結:文章的作者、課程的章節、產品的相關產品。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 頁面編輯關聯以重新命名兩側或設定第二個上限。

從早期版本更新的站點可能仍有處於此狀態的欄位。參見參照欄位繫結到關聯,了解更新會繫結什麼、又留給你什麼。