Files
upstream-twenty/packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-many-to-many-relations.mdx
upstream-mirror e7da97194a
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 3s
snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
2026-09-17 23:28:13 +05:00

176 lines
7.2 KiB
Plaintext

---
title: Crear relaciones de muchos a muchos
description: Conecta registros en los que muchos elementos en ambos lados pueden vincularse entre sí mediante objetos de unión.
---
Las relaciones de muchos a muchos te permiten conectar varios registros en ambos lados. Por ejemplo: muchas personas pueden trabajar en muchos proyectos, y cada proyecto puede tener muchas personas.
<Warning>
**Función beta**: Las relaciones de unión están actualmente en beta. Actívalas en **Settings → Community → Features** antes de seguir esta guía.
</Warning>
<Note>
Esta función también requiere que **Advanced mode** esté activado (interruptor en la esquina inferior izquierda de Settings).
</Note>
## Cuándo usar relaciones de muchos a muchos
Usa relaciones de muchos a muchos cuando ambos lados de una relación pueden tener varias conexiones:
| Relación | Ejemplo |
| ----------------- | ---------------------------------------------------------------------------------------- |
| People ↔ Projects | Una persona trabaja en varios proyectos; un proyecto tiene varios miembros del equipo |
| Companies ↔ Tags | Una empresa puede tener varias etiquetas; una etiqueta puede aplicarse a varias empresas |
| Products ↔ Orders | Un producto puede estar en varios pedidos; un pedido contiene varios productos |
## Cómo Funciona
Twenty utiliza un patrón de **objeto de unión** para las relaciones de muchos a muchos. Un objeto de unión se sitúa entre dos objetos y contiene las conexiones:
```
People ←→ Project Assignments ←→ Projects
```
El objeto **Project Assignments** (unión) tiene:
* Una relación con People (muchos a uno)
* Una relación con Projects (muchos a uno)
Cuando activas el interruptor de relación de unión, Twenty muestra los registros vinculados directamente en lugar de mostrar los registros intermedios de unión.
## Prerrequisitos
1. **Habilita Junction Relations en Beta Features**: Ve a **Settings → Community → Features** y habilita **Junction Relations**
2. **Activa Advanced mode**: Activa **Advanced mode** en la parte inferior izquierda de la barra lateral de Settings
3. Planifica tu modelo de datos:
* ¿Qué dos objetos estás conectando?
* ¿Cómo debería llamarse el objeto de unión?
## Paso 1: Crear el objeto de unión
Primero, crea el objeto intermedio que contendrá las conexiones.
1. Vaya a **Configuración → Modelo de datos**
2. Haga clic en **+ Añadir objeto**
3. Asígnale un nombre descriptivo (p. ej., "Project Assignment", "Team Member", "Product Order")
4. Activa "Omitir la creación de un campo Nombre"
<img src="/images/user-guide/fields/new-pivot-object.png" alt="Nuevo objeto de unión" />
5. Haga clic en **Guardar**
<Tip>
**Convención de nombres**: Usa un nombre que describa la relación, como "Project Assignment" o "Team Membership". Esto hace que el modelo de datos sea más fácil de entender.
</Tip>
## Paso 2: Crea relaciones entre los objetos y el objeto de unión
Agrega campos de relación desde cada uno de tus dos objetos al objeto de unión.
### Primera relación (Objeto A → Unión)
1. Selecciona tu primer objeto en **Settings → Data Model**
2. Haz clic en **+ Add Relation**
3. Selecciona el objeto de unión (p. ej., "Project Assignments")
4. Configura el tipo de relación como **One-To-Many** (una persona puede vincularse a muchas asignaciones)
5. Nombra los campos:
* Campo en People: p. ej., "Project Assignments"
* Campo en unión: p. ej., "Person"
6. Haga clic en **Guardar**
### Segunda relación (Objeto B → Unión)
1. Selecciona tu segundo objeto en **Settings → Data Model**
2. Haz clic en **+ Add Relation**
3. Selecciona el objeto de unión (p. ej., "Project Assignments")
4. Configura el tipo de relación como **One-To-Many** (un proyecto puede vincularse a muchas asignaciones)
5. Activa **"This is a relation to a Junction Object"**
<img src="/images/user-guide/fields/junction-relation-toggle.png" style={{width:'100%'}} />
6. Nombra los campos:
* Campo en unión: p. ej., "Project"
* Campo en Projects: p. ej., "Team Members"
7. Haga clic en **Guardar**
## Paso 3: Configurar la visualización de la relación de unión
Ahora configura los objetos de origen para mostrar los registros vinculados directamente, omitiendo el objeto de unión intermedio.
1. Vaya a **Configuración → Modelo de datos**
2. Selecciona el primer objeto (p. ej., "People")
3. Encuentra el campo de relación que apunta al objeto de unión (p. ej., "Project Assignments")
4. Haz clic para editar el campo
5. Activa **"This is a relation to a Junction Object"**
6. Selecciona la **Target relation** (p. ej., "Project" — el campo en la unión que apunta al otro lado)
7. Haga clic en **Guardar**
## Resultado
Después de la configuración:
* En un registro de **Person**, el campo "Project Assignments" muestra **Projects** directamente (no registros de asignación)
* En un registro de **Project**, el campo "Team Members" muestra **People** directamente
El objeto de unión sigue existiendo y almacena las conexiones, pero la interfaz presenta una vista de muchos a muchos más limpia.
## Ejemplo: People ↔ Projects
Aquí tienes una guía completa paso a paso:
### Crear el objeto de unión
* Nombre: **Project Assignment**
* Descripción: "Vincula a las personas con los proyectos en los que trabajan"
### Agregar relaciones
1. **People → Project Assignment**
* Tipo: One-to-Many
* Campo en People: "Project Assignments"
* Campo en Assignment: "Person"
2. **Projects → Project Assignment**
* Tipo: One-to-Many
* Campo en Projects: "Team Members"
* Campo en Assignment: "Project"
### Configurar la visualización de la unión
1. En el objeto **People**:
* Edita el campo "Project Assignments"
* Activa el interruptor de unión
* Destino: "Project"
2. En el objeto **Projects**:
* Edita el campo "Team Members"
* Activa el interruptor de unión
* Destino: "Person"
### Úsalo
* Abre un registro de Person → Ve sus Projects directamente
* Abre un registro de Project → Ve los miembros del equipo directamente
* Crea nuevas conexiones desde cualquiera de los dos lados
## Agregar datos adicionales a las conexiones
Como el objeto de unión es un objeto real, puedes agregar campos personalizados para almacenar información sobre la relación:
* **Rol**: "Desarrollador", "Diseñador", "Gerente"
* **Fecha de inicio**: Cuando la persona se unió al proyecto
* **Horas asignadas**: Horas semanales en este proyecto
Para acceder a estos datos, navega directamente al objeto de unión o consúltalo mediante la API.
## Limitaciones
* **Importación/Exportación CSV**: No se admite importar relaciones de muchos a muchos directamente. En su lugar, importa registros al objeto de unión.
* **Filtros**: Filtrar por relaciones de muchos a muchos puede tener opciones limitadas.
## Relacionado
* [Campos de relación](/l/es/user-guide/data-model/capabilities/relation-fields) — tipos de relaciones explicados
* [Crear objetos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-objects) — cómo crear objetos
* [Crear campos de relación](/l/es/user-guide/data-model/how-tos/create-relation-fields) — configuración básica de relaciones