> ## Documentation Index
> Fetch the complete documentation index at: https://docs-fw.madbuilder.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# 02. Carregamento de objetos

Com uma conexão aberta com o BD, já podemos carregar objetos e para isso o Adianti Framework oferece diversas maneiras, vejamos algumas:

**Carregamento de objeto**

O código-fonte abaixo irá carregar as informações do registro 1 da tabela `funcionario`.

```php theme={null}
    TTransaction::open('exemplos');

    $funcionario = new Funcionario(1);

    TTransaction::close();
```

A query SQL gerada pelo código-fonte acima foi:

```sql theme={null}
    SELECT * FROM funcionario WHERE (id = 1)
```

É importante ressaltar que: `Funcionario` é uma classe Active Record que trabalha em cima da tabela `funcionario` do BD.

**Carregamento estático de objeto**

Outra maneira de carregar um objeto (essa sem instanciar diretamente a classe) é realizar um carregamento por uma chamada estática de carregamento.

```php theme={null}
    TTransaction::open('exemplos');

    $funcionario = Funcionario::find(1);

    TTransaction::close();
```

O código-fonte acima irá gerar exatamente a mesma query que o exemplo anterior:

```sql theme={null}
    SELECT * FROM funcionario WHERE (id = 1)
```

## 2.1. Qual a diferença entre o carregamento normal e o estático?

Acabamos de ver que os dois carregamentos de objetos demonstrados têm como resultado a mesma query, então ficamos com a pergunta: qual a diferença entre eles?

A resposta é bem simples, o carregamento normal lança uma exceção quando não encontra o objeto, já o carregamento estático retorna `NULL`.

Veja a diferença:

```php theme={null}
    try
    {
        TTransaction::open('exemplos');

        $funcionario = new Funcionario(9999);
        var_dump($funcionario);

        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('erro', $e->getMessage());
        return false;       
    }
```

No caso acima, será lançada a seguinte mensagem de exceção:

`O objeto 9999 não encontrado em funcionario`

Carregamento estático:

```php theme={null}
    try
    {
        TTransaction::open('exemplos');

        $funcionario = Funcionario::find(9999);
        var_dump($funcionario);

        TTransaction::close();

    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('erro', $e->getMessage());
        return false;       
    }
```

No carregamento estático, o objeto fica nulo.

**Como carregar o primeiro e o último objeto?**

O Adianti Framework fornece duas funções para resolver essas questões, são elas:

1. `first()`;
2. `last()`.
   Essas duas funções estáticas devem ser usadas em uma classe de modelo (TRecord), assim o framework conseguirá carregar o registro da tabela correta. Veja abaixo dois exemplos, um para o primeiro registro e outro para o último:

```php theme={null}
    try
    {
        TTransaction::open('exemplos');

        $primeiroCliente = Cliente::first();
        $ultimoCliente   = Cliente::last();

        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());     
    }
```

Os comandos SQL gerados foram:

```sql theme={null}
    SELECT min(id) as id FROM cliente;

    SELECT * FROM cliente WHERE (id = 3);

    SELECT max(id) as id FROM cliente;

    SELECT * FROM cliente WHERE (id = 63294);
```

É possível notar que o framework primeiro identifica o primeiro e último IDs para depois carregar os dados do registro.
