リレーション

このページ

リレーションは 2 つのコレクションを結合し、それらのエントリ間のリンクを所有します。投稿の著者、レッスンの章、商品の関連商品などです。reference フィールド は一方の端からリレーションを見て、編集者にそのためのピッカーを提供します。

リレーションがリンクを所有するため、両方のコレクションが同じ一組を編集できます。スラッグ、各側の名前、各側がリンクできるエントリ数の上限はリレーションに属するため、posts 上のフィールドと authors 上のフィールドが同じリンクについて食い違うことはありません。EmDash はリンクを両方のコレクションテーブルの外に、各エントリの翻訳グループでキー付けして保存するため、エントリのすべての翻訳が同じ選択を共有します。

端はリンクする側とリンクされる側です。posts から authors へのリレーションでは、posts 上のフィールドが投稿がリンクする著者を選び、authors 上のフィールドがそれにリンクする投稿を一覧します。

リレーションを追加する

両方のコンテンツタイプが存在する必要があります。

  1. 管理画面で Content Types を開き、次に Relations を開きます。

  2. New Relation をクリックし、2 つのコンテンツタイプを選びます。Links from は選ぶ側、Links to は選ばれる側です。

  3. Roles の下で、各側を複数形と単数形で名前付けします。名前はコンテンツタイプから入力され、編集できます。参照フィールドは、選ぶ側の名前を取ります。

  4. Slug を確認します。名前に従い、参照フィールドがそれを保存します。

  5. How many の下で、各側の上限を設定します。One、Any number、または At most と指定する Maximum。リレーションに束縛された両方のフィールドがこれらの上限を共有します。

  6. リレーションを作成します。

2 つのコンテンツタイプとスラッグは、リレーションが存在すると固定されます。各リンクはリレーションでキー付けされるため、端を動かすと保存済みリンクが誤ったタイプのコンテンツを指します。別のコンテンツタイプを結合するには、別のリレーションを作成します。

名前と上限は編集可能なままです。上限を下げても既存のリンクはそのまま残り、新しい上限を超える選択のエントリを保存すると、選択が収まるまで拒否されます。

コンテンツタイプ自身のページは、フィールドの下の 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. ラベルとスラッグを確認します。ラベルはフィールドが選ぶ側から来て、後でフィールドをリネームするとリレーションのその側もリネームされます。

  6. フィールドを追加します。

1 つのリレーションは端ごとに 1 つのフィールドを取るため、同じ端への 2 つ目のフィールドは拒否されます。同じリンクを書く 2 つのピッカーには定義された結果がありません。両方のコンテンツタイプが同じリンクの一組を編集できるようにするには、同じリレーションの各端にフィールドを追加します。

参照フィールドは独自の列を持たないため、searchable や indexed にできません。コンテンツ一覧のフィルタとサイト検索は対象にしません。

エディタでエントリを選ぶ

フィールドはエントリエディタでピッカーとして表示されます。Add reference は参照先コンテンツタイプの検索を開きます。1 エントリに制限されたフィールドは、1 つ保持すると Replace reference を提供します。選ばれた各エントリは新しいタブで開く、削除する、またはリンクされる側を選ぶフィールドでは上下に動かしてテンプレートが読む順序を設定できます。リンクする側を選ぶフィールドは、これにリンクするエントリを一覧し、それらに独自の順序はありません。

選択はエントリとともに 1 回のリクエストで保存されます。リビジョンを保持するコレクションでは、公開済みエントリの選択変更は、エントリの他の保留中の編集とともに下書きにステージされます。エントリが公開されるとライブになり、下書きとともに破棄されます。エントリのプレビューはステージされた選択を表示します。

エントリに何がリンクしているかを見る

リレーションのもう一方の端に参照フィールドを追加します。リンクする側を選ぶフィールドは、これにリンクするエントリを一覧するため、ページを編集する著者はそこに指す投稿を見られ、どちらの端からでもその一組を変更できます。

テンプレートでリンクを読む

参照フィールドはエントリの 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 配列でリレーションを宣言し、参照フィールドはスラッグでそれに束縛します。代わりに targetCollection を名前付けするフィールドには、それに対するリレーションが作成されます。emdash export-seed はサイトのリレーションを出力し、--with-content は各エントリのリンクを出力するため、サイトの選択はエクスポートと再適用を生き延びます。

フィールドまたはリレーションを削除する

参照フィールドを削除すると、使用するリレーションも削除するオプションがあり、それが伴うものを示します。リレーション、その下に保存されたリンク、もう一方のコンテンツタイプ上のフィールドです。チェックボックスを外すと、リレーションとそのリンクを保持します。たとえば、もう一方の端のフィールドがまだそれらを使う場合です。

リレーションを削除すると、常にそのリンクとそれに束縛されたフィールドが除去されます。コンテンツタイプを削除すると、それが端であるすべてのリレーションと、それらを見る他のコンテンツタイプ上のフィールドが除去されます。確認画面に一覧されます。

リレーションがないフィールドを束縛する

リレーションのない参照フィールドは、エントリを選ぶ代わりにテキストボックスに 1 つのエントリ ID を保持します。リレーションを与えるとピッカーになります。

  1. Content Types でコンテンツタイプを開き、フィールド行の編集アクションをクリックします。

  2. Referenced collection を選び、フィールドが複数のエントリを保持する場合は Allow multiple references を設定します。

  3. フィールドを保存します。

EmDash はフィールドとそのコンテンツタイプにちなんだ名前のリレーションを作成し、フィールドの列が保持するエントリ ID をリンクとしてコピーし、フィールドの searchable と indexed フラグをクリアするため、コンテンツ一覧のフィルタとサイト検索は対象外になります。リレーションは、もう一方から何件リンクして戻るかの上限を持ちません。列はそのまま残り、書き込みは止まります。Relations ページでリレーションを編集し、側の名前変更や 2 つ目の上限を設定します。

以前のリリースから更新されたサイトは、この状態のフィールドを持つことがあります。参照フィールドはリレーションに束縛される で、更新が何を束縛し、何をあなたに残すかを確認してください。