Skip to main content
O carregamento estático de coleções é uma ferramenta poderosa oferecida pelo Adianti Framework. Com ela é possível definir as colunas selecionadas, filtrar o carregamento de objetos e ainda paginar os resultados.

8.1. Como definir as colunas de uma consulta no banco de dados?

É possível chamar uma função estática chamada select() em uma Active Record para definir as colunas que serão carregadas no comando SQL gerado pelo framework. A função select() recebe como parâmetro uma ou mais “strings” que serão usadas para selecionar as colunas. E para que o Adianti Framework carregue os dados, é necessário chamar a função load(). Exemplos funcionais seriam: carregar apenas nomes diferentes da tabela de funcionários e carregar nome e idade dos funcionários:
    try
    {
        TTransaction::open('exemplos');

        $funcionarios_nomes = Funcionario::select('distinct nome')->load();

        $funcionarios_nomes_idades = Funcionario::select('nome', 'idade')->load();

        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());
    }
O primeiro comando SQL gerado foi:
    SELECT 
        distinct nome 
    FROM 
        funcionario
O segundo comando SQL gerado foi:
    SELECT 
        nome, idade 
    FROM funcionario

8.2. Como adicionar filtros no carregamento estático?

Da mesma maneira que a função select() existe para definir as colunas a serem selecionadas, existe a função where(), para criar filtros de carregamento de coleções. O uso mais simples da função where() usa três parâmetros:
    Model::where($variavel, $operador, $valor);
Para carregar os registros depois de adicionar o filtro, é necessário chamar a função load(). No exemplo abaixo, foi feito o carregamento apenas de funcionários acima de 18 anos:
    try
    {
        TTransaction::open('exemplos');

        $funcionarios_nomes = Funcionario::where('idade', '>', 18)->load();

        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());
    }
O comando SQL gerado foi:
    SELECT 
        nome, sobrenome, dt_nascimento, funcao_id, cidade_id, endereco, cep, id 
    FROM 
        funcionario 
    WHERE 
        (idade > 18)

8.3. Como adicionar mais de um filtro?

Ao usar o carregamento estático de coleções, é possível adicionar N filtros. Para isso, basta chamar mais vezes a função where(). Veja o exemplo a seguir, em que serão carregados todos os funcionários que:
  1. Tenham mais de 18 anos;
  2. O nome comece com a letra A;
  3. Tenham o CEP igual a 95900-000.
O código-fonte:
    try
    {
        TTransaction::open('exemplos');

        $funcionarios_nomes = Funcionario::where('idade', '>', 18)
                                         ->where('nome', 'like', 'A%')
                                         ->where('cep', '=', '95900000')
                                         ->load();


        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());
    }
O comando SQL gerado foi:
    SELECT 
        nome,
        sobrenome,
        dt_nascimento,
        funcao_id,
        cidade_id,
        endereco,
        cep,
        id
    FROM 
        funcionario
    WHERE 
        (idade > 18
        AND nome like 'A%' 
        AND cep = '95900000')
Atenção: sempre que mais de um filtro where for usado, somente o primeiro deve ser chamado com os caracteres ::. Os seguintes devem ser chamados com os caracteres ->.

8.4. Como definir colunas e filtros em um carregamento?

É possível combinar as funções select() e where() para carregar apenas as informações desejadas seguindo as regras da aplicação. Para isso, basta empilhar as funções da mesma maneira que quando é usado mais que um filtro. No exemplo abaixo, serão carregados apenas os nomes dos funcionários abaixo de 18 anos cujo nome começa com a letra A:
    try
    {
        TTransaction::open('exemplos');

        $funcionarios_nomes = Funcionario::select('nome')
                                         ->where('nome', 'like', 'A%')
                                         ->where('idade', '<', 18)
                                         ->load();


        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());
}
O comando SQL gerado foi:
    SELECT 
        nome 
    FROM 
        funcionario 
    WHERE 
        (nome like 'A%' AND idade < 18)

8.5. Como carregar os registros paginados?

Ainda no carregamento estático, é possível definir algumas propriedades, como ordenação, quantidade e paginação dos registros. No exemplo abaixo, iremos carregar todos os funcionários com 25 anos de idade ou mais ordenados em ordem decrescente pelo ID pegando 10 registros após pular 20 (paginação).
    try
    {
        TTransaction::open('exemplos');

        $funcionarios = Funcionario::select('id, nome')
                                   ->where('idade', '>=', 25)
                                   ->orderBy('id', 'desc')
                                   ->take(10)
                                   ->skip(20)
                                   ->load();

        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());
    }
O comando SQL gerado foi:
    SELECT 
        id, nome 
    FROM 
        funcionario 
    WHERE 
        (idade >= 25) 
    ORDER BY id desc 
    LIMIT 10 
    OFFSET 20

8.6. Como usar o operador OU em carregamentos estáticos?

Nos exemplos anteriores, todos os critérios de filtros eram adicionados com o operador E (and), pois esse é o comportamento padrão do carregamento estático. Mas o que fazer quando o desenvolvedor deseja utilizar outro critério? Para alterar o comportamento padrão do carregamento estático de coleções, precisaremos alterar o quarto parâmetro da função where(). Quando não definido, esse parâmetro recebe o valor do operador E. O exemplo abaixo mostra como definir o operador OU.
    try
    {
        TTransaction::open('exemplos');

        $funcionarios = Funcionario::select('nome')
                                   ->where('idade', '>', 25, TExpression::OR_OPERATOR)
                                   ->where('idade', '=', 22, TExpression::OR_OPERATOR)
                                   ->load();

        TTransaction::close();
    }
    catch (Exception $e)
    {
        TTransaction::rollback();
        new TMessage('error', $e->getMessage());
    }
O comando SQL gerado foi:
    SELECT 
        nome 
    FROM 
        funcionario 
    WHERE 
        (idade > 25 OR idade = 22)