Relación uno a uno
Una relación biunívoca significa que un objeto está relacionado con, como máximo, otro objeto de un tipo específico. Para definir una relación biunívoca, especifique el tipo de propiedad como el tipo de objeto de dominio relacionado.
Ejemplo
En este ejemplo, un Manufacturer puede hacer un solo Car:
class ToOneManufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; car?: Car; static schema: Realm.ObjectSchema = { name: 'ToOneManufacturer', properties: { _id: 'objectId', name: 'string', // A manufacturer that may have one Car object car: 'Car?', }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; static schema: Realm.ObjectSchema = { name: 'Car', properties: { _id: 'objectId', model: 'string', miles: 'int?', }, }; }
Relación de uno a muchos
Una relación uno a muchos significa que un objeto puede estar relacionado con varios objetos. Para definir una relación uno a muchos, especifique una propiedad cuyo tipo sea una lista o matriz del tipo de objeto Realm relacionado en su esquema de objetos.
Ejemplo
En este ejemplo, un Manufacturer puede crear muchos modelos Car:
class ToManyManufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<LinkedCar>; static schema: Realm.ObjectSchema = { name: 'ToManyManufacturer', properties: { _id: 'objectId', name: 'string', // A manufacturer's related LinkedCar objects cars: 'LinkedCar[]', }, }; } class LinkedCar extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; static schema: Realm.ObjectSchema = { name: 'LinkedCar', properties: { _id: 'objectId', model: 'string', miles: 'int?', // A car's related ToManyManufacturer objects manufacturer: { type: 'linkingObjects', objectType: 'ToManyManufacturer', property: 'cars', }, }, }; }
Relación inversa
Una relación inversa vincula un objeto con cualquier otro objeto que haga referencia a él en una relación definida de uno a muchos. Las definiciones de relación son unidireccionales por defecto. Debe definir explícitamente una propiedad en el modelo del objeto como una relación inversa.
Por ejemplo, la relación de varios "El fabricante tiene muchos coches" no crea automáticamente la relación inversa "El coche pertenece al fabricante". Si no se especifica la relación inversa en el modelo de objetos, se debe ejecutar una consulta independiente para buscar el fabricante de un coche.
Definir propiedades de relación inversa
Puede asignar una relación inversa a una propiedad en el esquema del objeto mediante linkingObjects. Esto le permite acceder a la relación inversa como si fuera una propiedad normal.
Una propiedad linkingObjects crea un vínculo a una relación específica. Se especifica la relación que se va a vincular con el tipo de objeto y el nombre de la propiedad de la relación.
Ejemplo
En este ejemplo, la propiedad cars del objeto ManufacturerInverse tiene una relación de muchos con un Lista de CarInverse objetos. Contiene todos los coches vinculados al fabricante.
La propiedad manufacturer del objeto CarInverse invierte esta relación. La propiedad manufacturer se actualiza automáticamente para hacer referencia a cualquier objeto ManufacturerInverse que contenga el objeto "car" en su propiedad cars.
class ManufacturerInverse extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<CarInverse>; static schema: Realm.ObjectSchema = { name: 'ManufacturerInverse', properties: { _id: 'objectId', name: 'string', // A manufacturer's related CarInverse objects cars: 'CarInverse[]', }, }; } class CarInverse extends Realm.Object { _id!: BSON.ObjectId; model!: string; manufacturer!: Realm.List<ManufacturerInverse>; miles?: number; static schema: Realm.ObjectSchema = { name: 'CarInverse', properties: { _id: 'objectId', model: 'string', miles: 'int?', // A car's related ManufacturerInverse objects manufacturer: { type: 'linkingObjects', objectType: 'ManufacturerInverse', property: 'cars', }, }, }; }
Buscar objetos vinculados en el código
Puedes encontrar todos los objetos que enlazan con un objeto determinado llamando al método Realm.Object.linkingObjects() del objeto. Esto resulta útil cuando quieres acceder a todos los objetos enlazados para una relación específica sin añadir una propiedad al esquema del objeto.
Ejemplo
En este ejemplo, tenemos un modelo de objeto LinkedCar que no tiene un campo manufacturer de tipo 'linkingObjects'. Se crean varios fabricantes y objetos de coche, añadiendo los coches recién creados al campo cars de un fabricante.
Podemos encontrar el fabricante de un coche usando el linkingObjects() método. Este método devuelve una colección de objetos Results que enlazan con el coche. En este ejemplo, solo un fabricante fabrica el modelo Sentra, por lo que podemos esperar que se llame Nissan.
Para encontrar el fabricante que fabrica un automóvil específico:
Llamar
linkingObjects()Pase el nombre de la clase del fabricante y el campo "automóviles" como parámetros
const getLinkedManufacturer = (car: LinkedCar): string => { const manufacturer = car.linkingObjects<ToManyManufacturer>( 'ToManyManufacturer', 'cars', )[0]; // Returns 'Nissan', as only one manufacturer is linked // to this car object. return manufacturer.name; };
Objetos incrustados
Un objeto incrustado es un tipo especial de objeto Realm que modela datos complejos sobre un objeto específico. Los objetos incrustados son similares a las relaciones, pero proporcionan restricciones adicionales y se adaptan de forma más natural al modelo de documento desnormalizado de MongoDB.
Realm aplica restricciones de propiedad únicas que tratan cada objeto incrustado como datos anidados dentro de un único objeto principal específico. Un objeto incrustado hereda el ciclo de vida de su objeto principal y no puede existir como un objeto independiente de Realm. Esto significa que los objetos incrustados no pueden tener una clave principal y que Realm los elimina automáticamente si se elimina su objeto principal.
Tip
Los tipos de objetos incrustados son reutilizables y componibles
Puedes usar el mismo tipo de objeto incrustado en varios tipos de objeto padre e incrustar objetos dentro de otros objetos incrustados. Incluso puedes referenciar recursivamente un tipo de objeto incrustado como propiedad opcional en su propia definición.
Nota
Realm utiliza eliminaciones en cascada para objetos incrustados
Modelos de objetos de reino
Para definir un objeto incrustado, establezca embedded en true. Puede hacer referencia a un tipo de objeto incrustado desde tipos de objeto primarios de la misma manera que define una relación:
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<CarWithEmbed>; warranties!: Realm.List<Warranty>; static schema: Realm.ObjectSchema = { name: 'Manufacturer', properties: { _id: 'objectId', name: 'string', cars: 'CarWithEmbed[]', // Embed an array of objects warranties: 'Warranty[]', }, }; } class CarWithEmbed extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; warranty?: Warranty; static schema: Realm.ObjectSchema = { name: 'CarWithEmbed', properties: { _id: 'objectId', model: 'string', miles: 'int?', // Embed one object warranty: 'Warranty?', }, }; } class Warranty extends Realm.Object { name!: string; termLength!: number; cost!: number; static schema: Realm.ObjectSchema = { name: 'Warranty', embedded: true, properties: { name: 'string', termLength: 'int', cost: 'int', }, }; }
Importante
Los objetos incrustados no pueden tener una clave principal.