Query customizada com TableGateway
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:
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:
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:
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:
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.
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 );
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 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'); } } );
Novo Comentário: