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: