Una relación une dos colecciones y posee los vínculos entre sus entradas: el autor de una entrada, los capítulos de una lección, los productos relacionados de un producto. Un campo reference ve una relación desde un extremo y da a los editores un selector para ella.
Como la relación posee los vínculos, ambas colecciones pueden editar el mismo conjunto. El slug, el nombre de cada lado y el límite de cuántas entradas puede vincular cada lado pertenecen a la relación, de modo que un campo en posts y un campo en authors no pueden discrepar sobre los mismos vínculos. EmDash almacena los vínculos fuera de ambas tablas de colección, indexados por el grupo de traducción de cada entrada, de modo que cada traducción de una entrada comparte una selección.
Los extremos son el lado que vincula y el lado vinculado. En una relación de posts a authors, un campo en posts elige los autores a los que se vincula un post, y un campo en authors enumera los posts que se vinculan a él.
Añadir una relación
Ambos tipos de contenido deben existir antes de poder unirlos.
-
Abre Content Types en el admin y luego Relations.
-
Haz clic en New Relation y elige los dos tipos de contenido. Links from es el lado que elige; Links to es el lado que se elige.
-
En Roles, nombra cada lado en plural y singular. Los nombres se rellenan desde los tipos de contenido y se pueden editar. Un campo de referencia toma el nombre del lado del que elige.
-
Comprueba el Slug. Sigue a los nombres, y los campos de referencia lo almacenan.
-
En How many, establece el límite de cada lado: One, Any number o At most con un Maximum que indiques. Ambos campos vinculados a la relación comparten estos límites.
-
Crea la relación.
Los dos tipos de contenido y el slug quedan fijos una vez que la relación existe. Cada vínculo está indexado por la relación, así que mover un extremo apuntaría vínculos almacenados a contenido del tipo incorrecto. Para unir tipos de contenido distintos, crea otra relación.
Los nombres y los límites siguen editables. Bajar un límite deja los vínculos existentes en su sitio, y guardar una entrada cuya selección exceda el nuevo límite se rechaza hasta que la selección encaje.
La propia página de un tipo de contenido enumera las relaciones de las que es un extremo, en un panel Relations bajo sus campos. Nuevo, editar y eliminar funcionan igual allí.
Añadir un campo de referencia
-
Abre el tipo de contenido en Content Types y haz clic en Add Field.
-
Elige Reference.
-
Selecciona la relación a la que vincular. La última opción, Create relation, abre el formulario de relación en el mismo diálogo y vuelve con la nueva relación seleccionada; en un sitio sin relaciones aún es la única opción.
-
En una relación cuyos dos extremos son el mismo tipo de contenido, establece This field picks en Entries this one links to o Entries that link to this one. En cualquier otro caso el propio tipo de contenido del campo decide el extremo, y el campo elige entradas del otro.
-
Comprueba la etiqueta y el slug. La etiqueta proviene del lado que elige el campo, y renombrar el campo más tarde renombra ese lado de la relación.
-
Añade el campo.
Una relación admite un campo por extremo, así que se rechaza un segundo campo sobre el mismo extremo: dos selectores que escriban los mismos vínculos no tendrían un resultado definido. Para que ambos tipos de contenido editen un mismo conjunto de vínculos, añade un campo en cada extremo de la misma relación.
Un campo de referencia no puede marcarse como searchable ni indexed, porque no almacena una columna propia. Los filtros de listas de contenido y la búsqueda del sitio no lo cubren.
Elegir entradas en el editor
El campo se muestra como un selector en el editor de entradas. Add reference abre una búsqueda sobre el tipo de contenido referenciado; un campo limitado a una entrada ofrece Replace reference una vez que tiene una. Cada entrada elegida puede abrirse en una pestaña nueva, eliminarse o, en un campo que elige el lado vinculado, moverse arriba y abajo para fijar el orden en que una plantilla las lee. Un campo que elige el lado que vincula enumera las entradas que se vinculan a esta, y no llevan un orden propio.
Las selecciones se guardan con la entrada, en una sola petición. En una colección que guarda revisiones, cambiar una selección en una entrada publicada la prepara en el borrador junto con las demás ediciones pendientes de la entrada: pasa a vivir cuando se publica la entrada, y se descarta con el borrador. Una vista previa de la entrada muestra la selección preparada.
Ver qué se vincula a una entrada
Añade un campo de referencia en el otro extremo de la relación. Un campo que elige el lado que vincula enumera las entradas que se vinculan a esta, de modo que un autor que edita una página ve los posts que apuntan a ella, y puede cambiar ese conjunto desde cualquiera de los extremos.
Leer vínculos en una plantilla
Los campos de referencia no forman parte del data de una entrada. Nombra los campos que una página renderiza en la opción references, y cada uno vuelve como una página de entradas:
---
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>}
Leer campos de referencia cubre paginación, comportamiento de vista previa, tipos generados y lo que cuesta cada llamada en consultas.
Declarar una relación en un seed
Un archivo seed declara relaciones en un array relations de nivel superior, y un campo de referencia se vincula a una por slug. Un campo que nombra una targetCollection en su lugar tiene una relación creada para él. emdash export-seed emite las relaciones de un sitio, y --with-content emite los vínculos de cada entrada, de modo que las selecciones de un sitio sobreviven a un export y a volver a aplicarlas.
Eliminar un campo o una relación
Eliminar un campo de referencia ofrece eliminar también la relación que usa, y nombra lo que eso se lleva: la relación, los vínculos almacenados bajo ella y el campo en el otro tipo de contenido. Desmarca la casilla para conservar la relación y sus vínculos, por ejemplo cuando el campo en el otro extremo aún los usa.
Eliminar una relación siempre quita sus vínculos y los campos vinculados a ella. Eliminar un tipo de contenido quita toda relación de la que es un extremo, junto con los campos en los otros tipos de contenido que las ven; la confirmación los enumera.
Vincular un campo que no tiene relación
Un campo de referencia sin relación guarda un ID de entrada en un cuadro de texto en lugar de elegir entradas. Dale una relación para convertirlo en un selector.
-
Abre el tipo de contenido en Content Types y haz clic en la acción de editar en la fila del campo.
-
Elige una Referenced collection, y activa Allow multiple references si el campo debe guardar más de una entrada.
-
Guarda el campo.
EmDash crea una relación con el nombre del campo y su tipo de contenido, copia los IDs de entrada que guarda la columna del campo como vínculos, y limpia las marcas searchable e indexed del campo, de modo que los filtros de listas de contenido y la búsqueda del sitio dejan de cubrirlo. La relación no pone límite a cuántas entradas se vinculan de vuelta por el otro lado. La columna se deja en su sitio y deja de escribirse; edita la relación en la página Relations para renombrar sus lados o fijar el segundo límite.
Un sitio actualizado desde una versión anterior puede tener campos en este estado. Consulta Los campos de referencia se vinculan a relaciones para lo que la actualización vincula y lo que te deja a ti.