Uma entidade é um objeto que pode ser visto como uma instância de uma classe de dados, como um registro da tabela que corresponde à dataclass na datastore associada. Entretanto, uma entidade também contém dados correlacionados ao database relacionado à datastore. O propósito da entidade é gerenciar dados (criar, atualizar, deletar). Quando uma referência de entidade é obtida através de uma seleção de entidade, retém informação sobre a seleção de entidade que permite iteração através da seleção.
Há duas maneiras para criar uma nova entidade em uma classe de dados:
Já que entidades são referências aos registros de database, pode criar entidades criando registros usando a linguagem 4D "clássica" e então referenciar os registros com métodos ORDA como entity.next( ) ou entitySelection.first( ).
Também pode criar uma entidade usando o método dataClass.new( ).
Lembre que a entidade só é criada na memória. Se quiser adicioná-la ao datastore, deve chamar o método entity.save( ).
Atributos de entidade estão disponíveis diretamente como propriedades de um objeto entidade. Para saber mais, veja Usar atributos de entidade.
Por exemplo, se quiser criar uma nova entidade na classe de dados "Employee" na datastore atual com "John" e "Dupont" atribuido ao primeiro nome e atributos de nome:
C_OBJECT($myEntity) $myEntity:=ds.Employee.new() //Cria um novo objeto do tipo entidade $myEntity.name:="Dupont" // atribui 'Dupont' ao atributo 'sobrenome' $myEntity.firstname:="John" //atribui 'John' ao atributo 'primeiro nome' $myEntity.save() //salva a entidade
Nota: Uma entidade é definida só no processo onde foi criada. Não é possível, por exemplo, armazenar uma referência à uma entidade em uma variável interprocesso e usá-la em outro processo.
Uma entidade contém uma referência ao registro 4D. Entidades diferentes podem referenciar ao mesmo registro 4D. Já que uma entidade pode ser armazenada em uma variável de objeto 4D, variáveis diferentes podem conter uma referência à mesma entidade.
Se executar o código abaixo:
C_OBJECT($e1;$e2) $e1:=ds.Employee.get(1) //acessa o empregado com ID 1 $e2:=$e1 $e1.name:="Hammer" //ambas as variáveis $e1 and $e2 partilham a referência à mesma entidade //$e2.name contains "Hammer"
Isso é ilustrado pelo gráfico abaixo:
Se executar:
C_OBJECT($e1;$e2) $e1:=ds.Employee.get(1) $e2:=ds.Employee.get(1) $e1.name:="Hammer" //variável $e1 contém uma referênce a uma entidade //variável $e2 contém outra referência a outra entidade //$e2.name contém "smith"
Isso é ilustrado pelo gráfico abaixo
Note entretanto que entidades referem ao mesmo registro. Se chamar o método entity.save( ), o registro será atualizado (exceto no caso de conflito, ver Trancar Entidades).
Na verdade, $e1 e $e2 não é a entidade em si mesma, mas a referência à entidade. Significa que pode passá-la diretamente a qualquer função ou método, e vai agir como um ponteiro, mas mais rápido que um ponteiro 4D. Por exemplo:
For each($entity;$selection) do_Capitalize($entity) End for each
E a função é:
$entity:=$1 $name:=$entity.lastname If(Not($name=Null)) $name:=Uppercase(Substring($name;1;1))+Lowercase(Substring($name;2)) End if $entity.lastname:=$name
Pode gerenciar uma entidade como qualquer objeto em 4D e passar sua referência diretamente como parâmetros
Nota: Não há conceito de "registro atual" como na linguagem 4D clássica com as entidades. Pode usar quantas entidades queiras ao mesmo tempo. Não há lock automático de uma entidade (ver Trancar Entidades). Quando uma entidade for carregada, usa o mecanismo 'Lazy loading', que significa que apenas a informação necessária é carregada. Mesmo assim, em cliente/servidor, a entidade pode ser carregada automaticamente se necessário.
Atributos de entidade armazenam dados e mapeiam campos coincidentes na tabela correspondente. Atributos de Entidade de tipo storage podem ser estabelecidos ou obtidos como propriedades simples como um objeto entidade, enquanto entidade de relatedEntity ou relatedEntities que vai retornar uma entidade ou uma seleção de entidade.
Por exemplo, para estabelecer um atributo armazenamento:
$entity:=ds.Employee.get(1) //obtém atributo employee com ID 1 $name:=entity.lastname //obtém o nome de empregado, por exemplo. "Smith"
entity.lastname:="Jones" //estabelece o nome de empregado
Nota: Atributos de imagem não podem ser atribuidos diretamente com que não podem ser atribuidos diretamente com uma dada rota em uma entidade.
Acessar um atributo relacionado depende do tipo de atributo. Por exemplo, com a estrutura abaixo:
Pode acessar dados através dos objetos relacionados:
$entity:=ds.Project.all().first().theClient //obtém a entidade Company associada ao projeto $EntitySel:=ds.Company.all().first().companyProjects //obtém a seleção de projetos para a empresa
Note que tanto Client e companyProjects no exemplo acima são atributos de relação primária e representam uma relação direta entre as duas classes de dados. Entretanto, atributos de relação também podem ser construidos sobre rotas através de relações em diferentes níveis, incluindo referências circulares. Por exemplo, considere a estrutura abaixo:
Cada empregado pode ser um gerente e pode ter um gerente. Para obter o gerente do gerente de um empregado, pode escrever:
Na arquitetura ORDA, atributos de relação contém dados diretamente relacionados às entidades:
Um atributo de relação tipo N->1 (relatedEntity ) contém uma entidade
Um atributo de relação tipo 1->N (relatedEntities ) contém uma seleção de entidade
Abaixo uma estrutura (simplificada):
Nesse exemplo, uma entidade na classe de dados "Employee" contém um objeto de tipo Entidade no atributo "employer" (ou um valor null). Uma entidade na classe de dados "Company" contém um objeto de tipo EntidadeSeleção no atributo "staff" (ou um valor null).
Para atribuir um valor diretamente ao atributo "employer", deve passar uma entidade existente da classe de dados "company", por exemplo:
$emp:=ds.Employee.new() // cria um empregado $emp.lastname:="Smith" // assigna um valor a um atributo $emp.employer:=ds.Company.query("name =:1";"4D")[0] //atribui uma entidade empresa $emp.save()
4D oferece uma possibilidade adicional para entrar um atributo de relação para uma entidade N relacionada a entidade "1" : se passa a chave primária da entidade "1" diretamente quando atribui um valor a um atributo de relação. Para que isso funcione, deve passar dados do tipo Número ou Texto (o valor da chave primária) para o atributo de relação. 4D então automaticamente cuida de pesquisar por entidades correspondentes na classe de dados. Por exemplo:
$emp:=ds.Employee.new() $emp.lastname:="Wesson" $emp.employer:=2 // atribui uma chave primária ao atributo de relação //4D procura pela empresa cuja chave primária (nesse caso, sua ID) é 2 //e a atribui ao empregado $emp.save()
Isso é particularmente útil quando estiver importando grandes quantidades de dados de um banco de dados relacional. Esse tipo de importação geralmente contém uma coluna "ID", que faz referência a uma chave primária que pode ser atribuida diretamente ao atributo de relação. Isso também significa que pode atribuir chaves primárias nas N entidades sem entidades correspondentes já criadas na classe datastore 1. Se atribuir uma chave primária que não exista na classe de datastore relacionada, ela é armazenada do mesmo jeito e atribuida por 4D logo que a entidade '1" for criada.
Pode atribuir ou modificar o valor de um atributo de entidade relacionada "1" da classe de dados "N" diretamente através do atributo relacionado. Por exemplo, se quiser modificar o atributo de nome de uma entidade Empresa relacionada de uma entidade Employee, pode escrever
$emp:=ds.Employee.get(2) // carrega a entidade Employee com a chave primária 2 $emp.employer.name:="4D, Inc." //modifica o atributo de nome da Company relacionada $emp.employer.save() //salva o atributo relacionado //a entidade relacionada é atualiada
As propriedades da entidade são, entretanto, enumeráveis:
ARRAY TEXT($prop;0) OB GET PROPERTY NAMES(ds.Employee.get(1);$prop) //$prop contém os nomes de todos os atributos de entidade
Para necessidades de exportação, você pode no entanto converter uma entidade a um objeto regular usando o método entity.toObject( ). Pode depois exportar a entidade como JSON, por exemplo:
C_OBJECT($entity_json) $entity_json:=JSON Stringify($myentity.toObject()) //retorna a entidade como JSON