Una relación expresa la conexión potencial entre registros en modelos de Cloud SQL. Representa la capacidad de un registro de asociarse con uno o más registros. Por ejemplo, un modelo Person
en una aplicación social podría tener una relación Friends
que represente la amistad entre dos personas.
Conceptos básicos de las relaciones
Las relaciones en App Maker son bidireccionales. Cada dirección se denomina extremo de relación y cada extremo de relación tiene dos propiedades, que se detallan a continuación:
- Nombre: el nombre del extremo de relación, que se usa para referirse a ella en la vinculación de datos y las secuencias de comandos.
- Recuento: la cantidad de conexiones que admite el extremo de relación. El recuento se puede establecer en uno (lo que significa que el registro solo acepta una conexión) o varios, (lo que significa que el registro acepta una cantidad ilimitada de conexiones). Las relaciones pueden ser de tipo uno a uno, uno a varios y varios a varios. El valor de recuento a recuento se denomina cardinalidad o grado de la relación.
Por ejemplo, una app de RR. HH. puede usar las relaciones entre los modelos EmployeeDB
y Teams
para representar a los empleados y sus equipos. Puedes crear una relación de varios a varios entre EmployeeDB
y Teams
porque cada empleado puede ser parte de varios equipos. A continuación, se muestran las propiedades de los extremos de relación:
- Nombre=Miembros, Recuento=Varios
- Nombre=Equipos, Recuento=Varios
También puedes crear una relación de uno a varios entre EmployeeDB
y Teams
, porque cada equipo puede tener un gerente y cada gerente puede tener varios equipos. A continuación, se muestran las propiedades de los extremos de relación:
- Nombre=Gerente, Recuento=Uno
- Nombre=Equipos, Recuento=Varios
Crea y edita relaciones
Para crear una relación, sigue estos pasos:
- Haz clic en un modelo de Cloud SQL y dirígete a la pestaña Relaciones (Relations).
Para crear una relación, haz clic en Agregar relación (Add Relation). Usa el asistente de creación para seguir estos pasos:
- Establece el modelo de destino para el otro extremo de relación.
- Selecciona el recuento para cada extremo de relación.
- (Opcional) Ingresa los nombres para cada extremo de relación si no deseas mantener los predeterminados.
- (Opcional) En el caso de las relaciones de uno a uno y uno a varios, selecciona Propietario (Owner) para un extremo de relación con un recuento de uno. Especifica un modelo Propietario en una relación solo si sucede lo siguiente:
Haz clic en Crear (Create).
Después de crear una relación, puedes editar el nombre del extremo de relación. Para los extremos de relación con un recuento de uno, puedes habilitar o inhabilitar la propiedad. Para los extremos de relación con un recuento de varios, puedes cambiar el orden.
Para editar una relación, sigue estos pasos:
- Haz clic en un modelo y dirígete a la pestaña Relaciones (Relations) correspondiente.
En la lista de relaciones, haz clic en el nombre del extremo de relación.
Para las relaciones que conectan registros en dos modelos, la lista de relaciones de cada modelo solo muestra el nombre del extremo de relación del modelo opuesto. Para las relaciones que conectan registros en el mismo modelo, se enumeran ambos extremos de relación. En el ejemplo del modelo
EmployeeDB
,Manager
yMembers
se enumeran en la pestaña Relaciones (Relations).Edita el nombre, el orden o el propietario. Tus cambios se guardan de forma automática.
Si quieres configurar el orden, selecciona el campo que quieres usar para ordenar los registros. Selecciona la casilla de verificación Ascendente (Ascending) a fin de establecer el orden de los registros para el extremo de relación. Si no especificas un orden de preferencia, lo determinará el backend de datos del modelo.
Propiedad de registros asociados
Para las relaciones que tienen como mínimo un extremo de relación con un recuento de uno, puedes especificar un Propietario, sujeto a algunas reglas. Cuando estableces un propietario, creas una relación de propietario y propiedad para los registros asociados en los dos modelos:
- Con propiedad: cuando una lógica de app o de usuario borra un registro del modelo de propietario, la app borra todos los registros de propiedad asociados. Cuando se borra un registro de propiedad, no se borran los registros de propietario.
- Sin propiedad: cuando se borra un registro en algún extremo de la relación, no se borran los del otro extremo.
Especifica un modelo de propietario en una relación, solo si se cumplen las siguientes condiciones:
- Los registros de propiedad no deben existir sin sus registros de propietario.
- Deseas que los registros en el extremo de propiedad de la relación se borren de forma automática cuando se borra el registro de propietario.
Ejemplo de propiedad
Es posible que desees borrar elementos de la factura cuando se borre una. Con una relación de uno a varios entre el modelo Invoice
y el modelo Item
, establece Invoice
como el propietario. Cuando un usuario borra un registro Invoice
, la app también borra todos los registros Item
de propiedad, que son los asociados con el registro Invoice
que se borró.
Ten en cuenta que los registros borrados son instancias específicas de elementos, como unidades de disco específicas del inventario, y no categorías de elementos, como los tipos de unidades de disco que almacenas.
Reglas de propiedad
- Solo el modelo de un lado de una relación de uno a uno o de uno a varios puede ser propietario.
- No puedes designar un modelo como propietario si eso crearía un ciclo de propiedad, es decir, si los registros A y B se poseen mutuamente.
Puedes encadenar las relaciones de propietario y propiedad. Por ejemplo, si tienes los siguientes modelos y relaciones:
- Modelos
Forum
,Topic
yComment
- Una relación de uno a varios de
Forum
aTopic
, con el modeloForum
como propietario - Una relación de uno a varios de
Topic
aComment
, con el modeloTopic
como propietario
Cuando borras un registro
Topic
, App Maker también borra todos los registrosComment
asociados. Cuando borras un registroForum
, App Maker borra todos los registrosTopic
asociados y sus registrosComment
asociados.- Modelos
Un modelo con varias relaciones puede ser propiedad de muchos modelos Propietarios.
Cuando borras un registro de un modelo Propietario, App Maker borra de otros modelos los registros que este poseía, incluso si los registros también son propiedad de registros en otros modelos.
Administra asociaciones entre registros
Una asociación es el vínculo real entre dos registros a través de una relación de modelo. Por ejemplo, si tienes una relación de uno a varios entre los extremos de relación Manager
y Teams
, hay asociaciones entre el registro de Manager1
y los registros de cada equipo.
Según el flujo de trabajo de tu app, puedes crear y modificar asociaciones entre registros de las siguientes formas:
- Usa vinculaciones de datos con el fin de permitir que un widget muestre o cambie asociaciones para un registro.
- Usa una secuencia de comandos de cliente para manejar cambios de asociaciones más complicados que los que realiza la vinculación de datos.
- Usa una secuencia de comandos de servidor para manejar cambios masivos o hacer cambios de forma segura.
Modifica asociaciones con una vinculación de datos
Hay muchas formas de cambiar las asociaciones entre registros a través de vinculaciones de datos, pero la más simple es acceder a un extremo de relación como una propiedad de un item
de fuente de datos de modelos. En las fuentes de datos de modelos, los extremos de relación se exponen como propiedades de registro, al igual que los campos.
Si quieres habilitar una visualización de widget o cambiar los registros asociados para el registro que está seleccionado, vincula el value
del widget a @datasource.item.[relation end name]
. Este método es útil especialmente para los widgets desplegables (cuando el extremo de relación tiene un recuento de uno) y los cuadros de selección múltiple (cuando el extremo de relación tiene un recuento de varios). Para obtener un ejemplo, consulta el instructivo Conecta modelos de datos. Cuando creas los elementos de la IU para enumerar a los empleados, debes configurar vinculaciones entre los valores de widget y las fuentes de datos.
Modifica asociaciones con una secuencia de comandos de cliente
Este enfoque es más difícil que las vinculaciones de datos, porque debes asegurarte de que la fuente de datos cargó los registros asociados con el registro. Puedes asegurarte de que los registros asociados se hayan cargado de las siguientes maneras:
- Habilita la recuperación previa para la fuente de datos.
- Llama a
_loadRelation-name
en el registro y espera una devolución de llamada asíncrona. - Espera el evento
onLoad
de una fuente de datos de relación. - Espera el evento
onDataLoad
de un widget que usa una fuente de datos de relación.
Por ejemplo, si quieres continuar con la situación de relación entre EmployeeDB
y Team
anterior, puedes usar el siguiente código para asociar registros (asigna un gerente a un miembro del equipo y, luego, agrega ese miembro del equipo al equipo del gerente). Para facilitar el acceso a los registros de empleados correctos, creaste dos fuentes de datos en el modelo EmployeeDB
:
Manager
, que te permite seleccionar un gerenteMember
, que te permite seleccionar un miembro del equipo
var managerRecord = app.datasources.Manager.item;
var teamRecord = app.datasources.Teams.item;
// Assign the manager to the team.
teamRecord.Manager = managerRecord;
// Changes are saved automatically if the datasource in auto-save mode
// Add a team member to a Manager's team.
// Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
var engineerRecord = app.datasources.TeamMember.item;
teamRecord.Members.push(engineerRecord);
Modifica asociaciones con una secuencia de comandos del servidor
Es más fácil modificar asociaciones en las secuencias de comandos del servidor que en las del cliente, porque no tienes que preocuparte por cuándo se cargan los registros asociados. Accede al registro apropiado y, luego, usa sus propiedades de extremo de relación para asociar registros a través de la relación.
Por ejemplo, si quieres continuar con la situación de relación entre EmployeeDB
y Team
anterior, puedes agregar gerentes y miembros a equipos con la siguiente secuencia de comandos del servidor:
// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");
// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;
// Note: The new association is not saved yet
// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);
// Save both changes to the database.
app.saveRecords([teamRecord]);
Filtrado de relaciones
Para ordenar o filtrar los registros por un campo en un modelo de Cloud SQL relacionado, agrega los nombres de la relación seguidos de un nombre de campo. Por ejemplo, para filtrar una relación Mother
por el campo Age
de los registros relacionados, usa Mother.Age
.
También puedes aplicar los filtros equals
, notEquals
, in
y notIn
en un registro asociado o clave de registro. Por ejemplo, para verificar que el gerente de un gerente esté asignado de forma correcta, puedes filtrarlo por Manager.Manager._key._equals
.
El filtrado de relaciones está disponible en vinculación de datos y secuencias de comandos del servidor.
Lecturas adicionales
- Obtén más información sobre las fuentes de datos de relación.
- Prueba relaciones en el instructivo Conecta modelos de datos.