TableIdentifier – adicionando outros schemas na sua consulta

Hoje vamos falar de uma classe do Zend Framework 2 que serve para utilizar tabelas de outro schema na consulta, por vezes nos deparamos com registros em outra base e precisamos dar um join na mesma, coisa corriqueira num sql normal, mas no tablegateway já definimos previamente que nossa consulta utiliza um determinado schema, por fim achei essa solução utilizando dos recursos do framework.

//devemos incluir no inicio
use Zend\Db\Sql\TableIdentifier;

...
...

public function getUserLog($user_id, $date_log)
{
return $this->tableGateway->select(function (Select $select) use ($user_id, $date_log) {
$select->join(array('ulog' => new TableIdentifier('users_log', 'schema_log')), "ulog.user_id = user_id");
$select->where(array('user_id' => $user_id));
$select->where->greaterThan('date_log', $date_log);
});
}

certifique-se da sintaxe no TableIdentifier o primeiro parâmetro é o nome da tabela o segundo parâmetro é o nome da base.

Qualquer duvida, erros, ajustes e etc… comenta ai!

Custom query com Zend Framework 2

As vezes temos uma query muito complexa e temos que acabar utilizado alguma consulta mais elaborada, que no zend framework 2 ficaria dificil de implementar fica a dica abaixo com uma maneira fácil de usar uma custom query com zend framework 2, a sintaxe é muito parecida com a do PDO.
EX:

/**
* Get users by id and status
*
* @param $user_id
* @param $user_status
* @return mixed
*/
public function getUser($user_id, $user_status = 'active')
{
$statement = $this->tableGateway->getAdapter()->createStatement(
'SELECT u.user_id, u.name, u.email, p.number, a.street
FROM users u
JOIN phone p ON p.user_id = u.user_id
JOIN address a ON a.user_id = u.user_id
WHERE u.user_id = :user_id AND u.status = :user_status');
return current(iterator_to_array($statement->execute(array(
':user_id' => $user_id,
':user_status' => $user_status,
))));
}

Notem que no final, o retorno do execute estou utilizando a função iterator_to_array , ela serve para fazer uma copia do iterator do zend para um array simples, assim ele utiliza o retorno com os campos personalizados dos campos da nossa consulta, sem forçar utilizar a estrutura do nosso objeto, tambem estou utilizando o current que retorna o elemento atual que esta no ponteiro interno do array, como essa consulta deve retornar somente 1 registro estou utilizando o current, mas caso traga mais de 1 registro pode remover a função.

ao invés do current pode ser usado dessa forma, forcando retornar o primeiro elemento do array.

return iterator_to_array($statement->execute(array(
':user_id' => $user_id,
':user_status' => $user_status,
)))[0];

Qualquer duvida, erros, ajustes e etc… comenta ai!