Docs Menu
Docs Home
/ /
Datos del modelo

Relaciones y objetos integrados - SDK de React Native

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?',
},
};
}

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',
},
},
};
}

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.

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',
},
},
};
}

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:

  1. Llamar linkingObjects()

  2. 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;
};

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

Al eliminar un objeto Realm, Realm elimina automáticamente cualquier objeto incrustado referenciado por dicho objeto. Los objetos que la aplicación deba conservar tras la eliminación de su objeto principal deben usar relaciones.

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.

Volver

Define un modelo de objeto

En esta página