この機能を使うには 詳細モード も有効にする必要があります(Settings の右下にあるトグルで切り替え)。
多対多を使うタイミング
関係の両側が複数の接続を持ちうる場合に、多対多を使用します。| 関係 | 例 |
|---|---|
| 連絡先 ↔ プロジェクト | 1 人の連絡先は複数のプロジェクトで作業でき、1 つのプロジェクトには複数のチームメンバーがいます。 |
| 会社 ↔ タグ | 1 社には複数のタグを付与でき、1 つのタグは複数の会社に適用できます。 |
| 商品 ↔ 注文 | 1 つの商品は複数の注文に含まれ、1 件の注文には複数の商品が含まれます。 |
仕組み
Twenty は多対多リレーションに ジャンクションオブジェクト パターンを使用します。 ジャンクションオブジェクトは 2 つのオブジェクトの間に位置し、接続を保持します。- People へのリレーション(多対1)
- Projects へのリレーション(多対1)
前提条件
- Lab で Junction Relations を有効化: Settings → Updates → Lab に移動し、Junction Relations を有効にします
- 詳細モードを有効化: 設定サイドバーの右下にある Advanced mode のトグルをオンにします
- データモデルを計画する:
- どの 2 つのオブジェクトを接続しますか?
- ジャンクションオブジェクトの名称は何にしますか?
ステップ 1: ジャンクションオブジェクトを作成する
まず、接続を保持する中間オブジェクトを作成します。- 設定 → データモデル に移動します
- + New object をクリック
- わかりやすい名前を付けます(例: “Project Assignment”、“Team Member”、“Product Order”)
- 保存をクリック
ステップ 2: ジャンクションオブジェクトからリレーションを作成する
ジャンクションオブジェクトから、接続したい両方のオブジェクトへのリレーションフィールドを追加します。最初のリレーション(ジャンクション → オブジェクト A)
- Settings → Data Model でジャンクションオブジェクトを選択します
- + Add Field をクリック
- フィールドタイプとして Relation を選択します
- 最初のオブジェクトを選択します(例: “People”)
- リレーションタイプを Many-to-One に設定します(多数の割り当てが 1 人の連絡先にリンクできます)
- フィールドに名前を付けます:
- ジャンクション側のフィールド: 例: “Person”
- People 側のフィールド: 例: “Project Assignments”
- 保存をクリック
2 番目のリレーション(ジャンクション → オブジェクト B)
- 引き続きジャンクションオブジェクトで、+ Add Field をクリックします
- フィールドタイプとして Relation を選択します
- 2 番目のオブジェクトを選択します(例: “Projects”)
- リレーションタイプを Many-to-One に設定します
- フィールドに名前を付けます:
- ジャンクション側のフィールド: 例: “Project”
- Projects 側のフィールド: 例: “Team Members”
- 保存をクリック
ステップ 3: ジャンクションリレーションの表示を設定する
次に、中間のジャンクションオブジェクトを介さずにリンクされたレコードを直接表示するよう、元のオブジェクトを設定します。- 設定 → データモデル に移動します
- 最初のオブジェクトを選択します(例: “People”)
- ジャンクションオブジェクトを指すリレーションフィールド(例: “Project Assignments”)を見つけます
- クリックしてフィールドを編集します
- “これはジャンクションオブジェクトへのリレーションです” を有効にします
- Target relation を選択します(例: “Project” — 反対側を指すジャンクション上のフィールド)
- 保存をクリック
- Data Model で “Projects” を選択します
- “Team Members” のリレーションフィールドを編集します
- ジャンクションのトグルを有効にします
- 対象リレーションとして “Person” を選択します
- 保存
結果
設定後:- Person レコードでは、“Project Assignments” フィールドに Projects が直接表示されます(割り当てレコードではありません)
- Project レコードでは、“Team Members” フィールドに People が直接表示されます
例: People ↔ Projects
完全な手順は以下のとおりです:ジャンクションオブジェクトを作成する
- 名前: Project Assignment
- 説明: “人と、その人が携わっているプロジェクトを関連付けます”
リレーションを追加する
-
Project Assignment → People
- タイプ: 多対1
- Assignment 側のフィールド: “Person”
- People 側のフィールド: “Project Assignments”
-
Project Assignment → Projects
- タイプ: 多対1
- Assignment 側のフィールド: “Project”
- Projects 側のフィールド: “Team Members”
ジャンクションの表示を設定する
-
People オブジェクトで:
- “Project Assignments” フィールドを編集
- ジャンクションのトグルを有効にする
- 対象: “Project”
-
Projects オブジェクトで:
- “Team Members” フィールドを編集
- ジャンクションのトグルを有効にする
- 対象: “Person”
使ってみる
- Person レコードを開く → 紐づく Projects を直接表示
- Project レコードを開く → チームメンバーを直接表示
- どちら側からでも新しい接続を作成できます
接続に追加データを持たせる
ジャンクションオブジェクトは実体のあるオブジェクトなので、関係に関する情報を保存するためのカスタムフィールドを追加できます。- 役割: “Developer”、“Designer”、“Manager”
- 開始日: プロジェクトに参加した日
- 割り当て時間: 当該プロジェクトの週あたりの時間
制限事項
- CSV インポート/エクスポート: 多対多リレーションの直接インポートには対応していません。 代わりに、ジャンクションオブジェクトにレコードをインポートしてください。
- フィルター: 多対多リレーションでのフィルタリングには制限がある場合があります。
関連
- リレーションフィールド — リレーションタイプの解説
- カスタムオブジェクトの作成 — オブジェクトの作成方法
- リレーションフィールドを作成 — 基本的なリレーションの設定