Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
176 lines
7.0 KiB
Plaintext
176 lines
7.0 KiB
Plaintext
---
|
|
title: Vytváření vztahů mnoho-na-mnoho
|
|
description: Propojte záznamy, kde lze mnoho položek na obou stranách vzájemně propojit pomocí spojovacích objektů.
|
|
---
|
|
|
|
Vztahy mnoho-na-mnoho vám umožňují propojit více záznamů na obou stranách. Například: mnoho lidí může pracovat na mnoha projektech a každý projekt může mít mnoho lidí.
|
|
|
|
<Warning>
|
|
**Beta Feature**: Vztahy přes spojovací objekt jsou momentálně v beta verzi. Povolte je v **Settings → Community → Features** předtím, než budete pokračovat podle tohoto návodu.
|
|
</Warning>
|
|
|
|
<Note>
|
|
Tato funkce také vyžaduje, aby byl povolen **Advanced mode** (přepínač je vlevo dole v Settings).
|
|
</Note>
|
|
|
|
## Kdy použít mnoho-na-mnoho
|
|
|
|
Použijte mnoho-na-mnoho, když obě strany vztahu mohou mít více propojení:
|
|
|
|
| Vztah | Příklad |
|
|
| --------------------- | --------------------------------------------------------------------------- |
|
|
| Lidé ↔ Projekty | Osoba pracuje na více projektech; projekt má více členů týmu |
|
|
| Společnosti ↔ Štítky | Společnost může mít více štítků; štítek může platit pro více společností |
|
|
| Produkty ↔ Objednávky | Produkt může být v několika objednávkách; objednávka obsahuje více produktů |
|
|
|
|
## Jak to funguje
|
|
|
|
Twenty používá u vztahů mnoho-na-mnoho vzor **spojovacího objektu**. Spojovací objekt leží mezi dvěma objekty a uchovává propojení:
|
|
|
|
```
|
|
People ←→ Project Assignments ←→ Projects
|
|
```
|
|
|
|
Objekt **Project Assignments** (spojovací) má:
|
|
|
|
* Vztah na People (mnoho k jednomu)
|
|
* Vztah na Projects (mnoho k jednomu)
|
|
|
|
Když povolíte přepínač pro vztah přes spojovací objekt, Twenty zobrazí propojené záznamy přímo místo zobrazení prostředních záznamů spojovacího objektu.
|
|
|
|
## Předpoklady
|
|
|
|
1. **Povolte Junction Relations v Beta Features**: Přejděte do **Settings → Community → Features** a povolte **Junction Relations**
|
|
2. **Povolte Advanced mode**: Zapněte **Advanced mode** vlevo dole na postranním panelu Settings
|
|
3. Naplánujte svůj datový model:
|
|
* Které dva objekty propojujete?
|
|
* Jak by se měl jmenovat spojovací objekt?
|
|
|
|
## Krok 1: Vytvořte spojovací objekt
|
|
|
|
Nejprve vytvořte mezilehlý objekt, který bude uchovávat propojení.
|
|
|
|
1. Přejděte do **Nastavení → Datový model**
|
|
2. Klikněte na **+ Přidat objekt**
|
|
3. Pojmenujte jej výstižně (např. "Project Assignment", "Team Member", "Product Order")
|
|
4. Přepněte "Přeskočit vytvoření pole Název" na zapnuto
|
|
|
|
<img src="/images/user-guide/fields/new-pivot-object.png" alt="Nový spojovací objekt" />
|
|
|
|
5. Klikněte na **Uložit**
|
|
|
|
<Tip>
|
|
**Konvence pojmenování**: Použijte název, který popisuje vztah, například "Project Assignment" nebo "Team Membership". Tím bude datový model srozumitelnější.
|
|
</Tip>
|
|
|
|
## Krok 2: Vytvořte vztahy mezi objekty a spojovacím objektem
|
|
|
|
Přidejte vztahová pole z obou objektů do spojovacího objektu.
|
|
|
|
### První vztah (Objekt A → Junction)
|
|
|
|
1. Vyberte svůj první objekt v **Settings → Data Model**
|
|
2. Klikněte na **+ Přidat vztah**
|
|
3. Vyberte spojovací objekt (např. "Project Assignments")
|
|
4. Nastavte typ vztahu na **One-To-Many** (jedna osoba může být propojena s mnoha přiřazeními)
|
|
5. Pojmenujte pole:
|
|
* Pole na People: např. "Project Assignments"
|
|
* Pole na spojovacím objektu: např. "Person"
|
|
6. Klikněte na **Uložit**
|
|
|
|
### Druhý vztah (Objekt B → Junction)
|
|
|
|
1. Vyberte svůj druhý objekt v **Settings → Data Model**
|
|
2. Klikněte na **+ Přidat vztah**
|
|
3. Vyberte spojovací objekt (např. "Project Assignments")
|
|
4. Nastavte typ vztahu na **One-To-Many** (jeden projekt může být propojen s mnoha přiřazeními)
|
|
5. Povolte **"This is a relation to a Junction Object"**
|
|
|
|
<img src="/images/user-guide/fields/junction-relation-toggle.png" style={{width:'100%'}} />
|
|
|
|
6. Pojmenujte pole:
|
|
* Pole na spojovacím objektu: např. "Project"
|
|
* Pole na Projects: např. "Team Members"
|
|
7. Klikněte na **Uložit**
|
|
|
|
## Krok 3: Nakonfigurujte zobrazení vztahu přes spojovací objekt
|
|
|
|
Nyní nakonfigurujte zdrojové objekty tak, aby zobrazovaly propojené záznamy přímo a přeskočily mezilehlý spojovací objekt.
|
|
|
|
1. Přejděte do **Nastavení → Datový model**
|
|
2. Vyberte první objekt (např. "People")
|
|
3. Najděte relační pole směřující na spojovací objekt (např. "Project Assignments")
|
|
4. Klikněte pro úpravu pole
|
|
5. Povolte **"This is a relation to a Junction Object"**
|
|
6. Vyberte **Target relation** (např. "Project" — pole na spojovacím objektu, které ukazuje na druhou stranu)
|
|
7. Klikněte na **Uložit**
|
|
|
|
## Výsledek
|
|
|
|
Po konfiguraci:
|
|
|
|
* Na záznamu **Person** pole "Project Assignments" zobrazuje přímo **Projects** (nikoli záznamy přiřazení)
|
|
* Na záznamu **Project** pole "Team Members" zobrazuje přímo **People**
|
|
|
|
Spojovací objekt stále existuje a ukládá propojení, ale rozhraní zobrazuje čistší pohled mnoho-na-mnoho.
|
|
|
|
## Příklad: Lidé ↔ Projekty
|
|
|
|
Zde je kompletní postup:
|
|
|
|
### Vytvořte spojovací objekt
|
|
|
|
* Název: **Project Assignment**
|
|
* Popis: "Propojuje lidi s projekty, na kterých pracují"
|
|
|
|
### Přidejte vztahy
|
|
|
|
1. **People → Project Assignment**
|
|
* Typ: One-to-Many
|
|
* Pole na People: "Project Assignments"
|
|
* Pole na Assignment: "Person"
|
|
|
|
2. **Projects → Project Assignment**
|
|
* Typ: One-to-Many
|
|
* Pole na Projects: "Team Members"
|
|
* Pole na Assignment: "Project"
|
|
|
|
### Nakonfigurujte zobrazení spojovacího objektu
|
|
|
|
1. Na objektu **People**:
|
|
* Upravte pole "Project Assignments"
|
|
* Povolte přepínač pro vztah přes spojovací objekt
|
|
* Cíl: "Project"
|
|
|
|
2. Na objektu **Projects**:
|
|
* Upravte pole "Team Members"
|
|
* Povolte přepínač pro vztah přes spojovací objekt
|
|
* Cíl: "Person"
|
|
|
|
### Použití
|
|
|
|
* Otevřete záznam osoby → Uvidíte její projekty přímo
|
|
* Otevřete záznam projektu → Uvidíte členy týmu přímo
|
|
* Vytvářejte nová propojení z obou stran
|
|
|
|
## Přidávání doplňkových dat do propojení
|
|
|
|
Protože spojovací objekt je skutečný objekt, můžete přidat vlastní pole k ukládání informací o vztahu:
|
|
|
|
* **Role**: "Developer", "Designer", "Manager"
|
|
* **Datum zahájení**: Když se osoba připojila k projektu
|
|
* **Hours Allocated**: Týdenní počet hodin na tomto projektu
|
|
|
|
Pro přístup k těmto datům přejděte přímo na spojovací objekt nebo jej dotazujte přes API.
|
|
|
|
## Omezení
|
|
|
|
* **CSV Import/Export**: Přímý import vztahů mnoho-na-mnoho není podporován. Místo toho importujte záznamy do spojovacího objektu.
|
|
* **Filters**: Filtrování podle vztahů mnoho-na-mnoho může mít omezené možnosti.
|
|
|
|
## Související
|
|
|
|
* [Relační pole](/l/cs/user-guide/data-model/capabilities/relation-fields) — vysvětlení typů vztahů
|
|
* [Vytváření vlastních objektů](/l/cs/user-guide/data-model/how-tos/create-custom-objects) — jak vytvářet objekty
|
|
* [Vytváření relačních polí](/l/cs/user-guide/data-model/how-tos/create-relation-fields) — základní nastavení vztahů
|