Una entidad es un objeto que puede verse como una instancia de una clase de datos, como un registro de la tabla que coincide con la clase de datos en su almacén de datos asociado. Sin embargo, una entidad también contiene datos correlacionados con la base de datos relacionada con el almacén de datos. El objetivo de la entidad es gestionar los datos (crear, actualizar, eliminar). Cuando se obtiene una referencia de entidad por medio de una selección de entidad, conserva información sobre la selección de entidad que permite la iteración a través de la selección.
Hay dos formas de crear una nueva entidad en una clase de datos:
Como las entidades son referencias a los registros de la base, puede crear entidades creando registros utilizando el lenguaje 4D "clásico" y luego hacer referencia a ellos con los métodos ORDA como entity.next( ) o entitySelection.first( ).
También puede crear una entidad utilizando el método dataClass.new( ).
Tenga en cuenta que la entidad solo se crea en la memoria. Si desea agregarla al almacén de datos, debe llamar al método entity.save( ).
Los atributos de entidad están directamente disponibles como propiedades del objeto de la entidad. Para más información, consulte Utilizar atributos entidad.
Por ejemplo, queremos crear una nueva entidad en la clase de datos "Empleado" en el almacén de datos actual con "John" y "Dupont" asignados a los atributos firstname y name:
C_OBJECT($myEntity) $myEntity:=ds.Employee.new() //Crea un nuevo objeto de tipo entidad $myEntity.name:="Dupont" // asigna 'Dupont' al atributo 'name' $myEntity.firstname:="John" //asigna 'John' al atributo 'firstname' $myEntity.save() //guarda la entidad
Nota: una entidad se define solo en el proceso en el que se creó. No puede, por ejemplo, hacer referencia a una entidad en una variable interprocesos y usarla en otro proceso.
Una entidad contiene una referencia a un registro 4D. Diferentes entidades pueden hacer referencia al mismo registro 4D. Además, dado que una entidad puede almacenarse en una variable objeto 4D, diferentes variables pueden contener una referencia a la misma entidad.
Si ejecuta el siguiente código:
C_OBJECT($e1;$e2) $e1:=ds.Employee.get(1) //accede al empleado con ID 1 $e2:=$e1 $e1.name:="Hammer" //ambas variables $e1 and $e2 comparten la referencia a la misma entidad //$e2.name contiene "Hammer"
Esto se ilustra con el siguiente gráfico:
Ahora si ejecuta:
C_OBJECT($e1;$e2) $e1:=ds.Employee.get(1) $e2:=ds.Employee.get(1) $e1.name:="Hammer" //variable $e1 contiene una referencia a una entidad //variable $e2 contiene otra referencia a otra entidad //$e2.name contiene "smith"
Esto se ilustra con el siguiente gráfico:
Sin embargo, tenga en cuenta que las entidades se refieren al mismo registro. En cualquier caso, si llama al método entity.save( ), el registro se actualizará (excepto en caso de conflicto, consulte Bloquear entidades).
De hecho $e1 y $e2 no son la entidad misma, sino una referencia a la entidad. Significa que puede pasarlo directamente a cualquier función o método, y actuará como un puntero, y más rápido que un puntero 4D. Por ejemplo:
For each($entity;$selection) do_Capitalize($entity) End for each
Y la función es:
$entity:=$1 $name:=$entity.lastname If(Not($name=Null)) $name:=Uppercase(Substring($name;1;1))+Lowercase(Substring($name;2)) End if $entity.lastname:=$name
Puede manejar una entidad como cualquier otro objeto en 4D y pasar sus referencias directamente como parámetros.
Nota: no existe un concepto de "registro actual" como en el lenguaje clásico 4D con las entidades. Puede usar tantas entidades como necesite al mismo tiempo. Tampoco hay un bloqueo automático en una entidad (ver Bloquear entidades). Cuando se carga una entidad, utiliza el mecanismo de "carga diferida", lo que significa que solo se carga la información necesaria. Sin embargo, en cliente/servidor, la entidad puede cargarse automáticamente directamente si es necesario.
Los atributos de entidad almacenan datos y asignan los campos correspondientes en la tabla correspondiente. Los atributos de entidad de tipo almacenamiento se pueden definir u obtener como propiedades simples del objeto de entidad, mientras que la entidad de tipo relatedEntity o relatedEntities devolverá una entidad o una selección de entidad.
Por ejemplo, para definir un atributo de almacenamiento:
$entity:=ds.Employee.get(1) //obtiene el atributo de empleado con ID 1 $name:=entity.lastname //obtiene el nombre del empleado, por ejemplo "Smith"
entity.lastname:="Jones" //define el nombre del empleado
Nota: los atributos de las imágenes no se pueden asignar directamente con una ruta dada en una entidad.
El acceso a un atributo relacionado depende del tipo de atributo. Por ejemplo, con la siguiente estructura:
Puede acceder a los datos a través de los objetos relacionados:
$entity:=ds.Project.all().first().theClient //obtiene la entidad de Company asociada al proyecto $EntitySel:=ds.Company.all().first().companyProjects //obtiene la selección de proyectos para la empresa
Tenga en cuenta que tanto theClient como companyProjects en el ejemplo anterior son atributos de relación primarios y representan una relación directa entre las dos clases de datos. Sin embargo, los atributos de relación también se pueden construir sobre rutas a través de relaciones en varios niveles, incluidas las referencias circulares. Por ejemplo, considere la siguiente estructura:
Cada empleado puede ser un gerente y puede tener un gerente. Para obtener el gerente del gerente de un empleado, simplemente puede escribir:
En la arquitectura ORDA, los atributos relación contienen directamente datos relacionados con las entidades:
Un atributo de relación de tipo N->1 (tipo relatedEntity) contiene una entidad
Un atributo de relación de tipo 1>N (tipo relatedEntities) contiene una selección de entidad
Veamos la siguiente estructura (simplificada):
En este ejemplo, una entidad en la clase de datos "Employee" contiene un objeto de tipo Entidad en el atributo "employer" (o un valor null). Una entidad en la clase de datos "Company" contiene un objeto de tipo EntitySelection en el atributo "staff" (o un valor null).
Nota: en ORDA, la propiedad automática o manual de las relaciones no tiene ningún efecto.
Para asignar un valor directamente al atributo "employer", debe pasar una entidad existente de la clase de datos "Company". Por ejemplo:
$emp:=ds.Employee.new() // crea un empleado $emp.lastname:="Smith" // asigna un valor a un atributo $emp.employer:=ds.Company.query("name =:1";"4D")[0] //asigna una entidad company $emp.save()
4D ofrece una facilidad adicional para ingresar un atributo relación para una entidad N relacionada con una entidad "1": pase la llave primaria de la entidad "1" directamente al asignar un valor al atributo de relación. Para que esto funcione, pase datos de tipo Número o Texto (el valor de llave principal) al atributo relación. 4D luego automáticamente se ocupa de buscar la entidad correspondiente en la clase de datos. Por ejemplo:
$emp:=ds.Employee.new() $emp.lastname:="Wesson" $emp.employer:=2 // asigna una llave principal al atributo relación //4D busca la empresa cuya llave principal (en este caso, su ID) sea 2 //y la asigna al empleado $emp.save()
Esto es particularmente útil cuando está importando grandes cantidades de datos de una base de datos relacional. Este tipo de importación generalmente contiene una columna "ID", que hace referencia a una llave principal que luego puede asignar directamente a un atributo relación. Esto también significa que puede asignar llaves primarias en las N entidades sin que las entidades correspondientes ya se hayan creado en la clase de datos 1. Si asigna una llave principal que no existe en la clase de datos relacionada, no obstante, 4D la almacena y asigna tan pronto como se crea esta entidad "1".
Puede asignar o modificar el valor de un atributo de entidad relacionado con "1" de la clase de datos "N" directamente a través del atributo relacionado. Por ejemplo, si desea modificar el atributo de nombre de una entidad de Company relacionada de una entidad Employee, puede escribir:
$emp:=ds.Employee.get(2) // carga la entidad Employee con la llave primaria 2 $emp.employer.name:="4D, Inc." //modifica el atributo de nombre de la empresa relacionada $emp.employer.save() //guarda el atributo relacionado //la entidad relacionada se actualiza
Las propiedades de la entidad son sin embargo enumerables:
ARRAY TEXT($prop;0) OB GET PROPERTY NAMES(ds.Employee.get(1);$prop) //$prop contiene los nombres de todos los atributos de entidad
Sin embargo, para exportación, puede convertir una entidad en un objeto normal utilizando el método entity.toObject( ). A continuación, puede exportar la entidad como JSON, por ejemplo:
C_OBJECT($entity_json) $entity_json:=JSON Stringify($myentity.toObject()) //devuelve la entidad como JSON