0

Query customizada com TableGateway

criado por Marcel em 28/08/2015 2:36pm
Para começar uma aplicação  que faz acesso a banco de dados utilizando o Zend Framework 2, a maneira mais prática de se executar as queries seria utilizando a classe do componente do ZF2 DB chamada TableGateway.

Veja um exemplo instanciando a classe:
<?php

use Zend\Db\TableGateway\TableGateway;
use Zend\Stdlib\Hydrator\ClassMethods as Hydrator;
use Zend\Db\ResultSet\HydratingResultSet;

$hydratingResultset = new HydratingResultSet(new Hydrator(), new Aluno());

$adapter = $serviceLocator->get('Zend\Db\Adapter\Adapter');
$tableGateway = new TableGateway(

    'aluno',

    $adapter,

    null,

    $hydratingResultset

);
Em seu construtor o TableGateway recebe 4 parâmetros. O primeiro é o nome da tabela no banco de dados que será modificada ou consultada que no exemplo é 'aluno'.

O segundo parâmetro é o adapter que no caso estou obtendo o serviço que está no service locator, imaginando que tenho essa variável preenchida adequadamente. Veja abaixo como posso configurar o molulo para pegar esse serviço de maneira que as configurações de banco de dados venham das definidas do module.config.php, basta editar o module.config.php para que o serviço 'Zend\Db\Adapter\Adapter' sejá criado pela factory de adapter do próprio zend:
'service_manager' => array(
    'factories' => array(

        'Zend\Db\Adapter\Adapter' =>
            'Zend\Db\Adapter\AdapterServiceFactory',

...
O terceiro parâmetro são as features do TableGateway, neste exemplo não utilizaremos nenhuma, portanto passamos NULL.

O quarto parâmetro é o HydratingResultSet que é o cara que o TableGateway vai utilizar para hidratar ou extrair o objeto relacionado à essa tabela. Para instanciar o HydratingResultSet é necessário passar por parâmetro um Hydrator e um objeto que será hidratado ou extraído. Como primeiro parâmetro estou utilizando o objeto que estou apelidando de Hydrator no momento em que faço o use, esse objeto na é verdade é o ClassMethod. Esse Hydrator utiliza os métodos get do objeto a ser extraído para gerar o array e utiliza os métodos set para hidratar (preencher o objeto) com os valores do array. Como segundo parâmetro estou passando um objeto Aluno imaginando que a classe contém get e set de seus atributos e que seus nomes são compatíveis como os nomes dos campos no banco de dados.

Agora que temos o objeto TableGateway, podemos executar as querys.

Os métodos mais usados são:

  • select

  • insert

  • update

  • delete


No caso do insert, update, delete recebem como parâmetro um array como os dados das linhas a serem modificadas, o select recebe por parâmetro um array como os campos que irão aparecer na clausula where da query.

O ponto chave dessa postagem é mostrar como alterar essa query para fazer consultas mais complexas. Porque até agora conseguimos fazer uma consulta de maneira bem prática, mas na query que executamos só conseguimos modificar a clausula where, mas e se quiser alterar a ordenação por exemplo?

A função select também pode receber por parâmetro uma função anônima (closure). Essa função recebe por parâmetro um objeto do tipo Zend\Db\Sql\Select com o qual é possível ter uma alcance maior de possibilidades de query.

Sendo assim para definir a ordenação de um consultado podemos fazer algo como:
use Zend\Db\Sql\Select;

$orderAsc = true;

$resultado = $tableGateway->select(
    function (Select $select) use ($orderAsc) {
        if ($orderAsc) {
            $select->order('name ASC');
        } else {
            $select->order('name DESC');
        }
    }
);
Nesse exemplo estou ordem por nome em ordem alfabética crescente se eu mudar o $orderAsc para false será em ordem decrescente, como permitido pela closure no PHP posso importar uma variável que está fora da função com a keyword use.

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)