Zend\Db\Sql\Sql

Zend\Db\Sql\Sql


A ideia dessa classe é estar relacionada ou representar ações em uma tabela. Essa classe pode dar a você um objeto Select para você trabalhar os detalhes da busca nele, enviar de volta à ela e receber um Statement para ser executado.


Quero buscar um produto.
Vou à Sql ligada à tabela produto.
Peço um objeto Select para fazer a busca.
Insiro os detalhes da busca nesse objeto select.
Envio o objeto Select de volta a Sql.
A Sql me retorna um Statement pronto para eu executá-lo.


Ao invés de escrever um comando sql à mão, eu receberia objetos para trabalhá-los e os dados dentro desses objetos virariam um statement à ser executado.


Preparando um objeto SQL
A instanciação da classe Sql pode ser feita com a passagem do adapter e tabela ao construtor dela. Veja abaixo um simples exemplo:


$sql = new Sql($adapter, ‘Product’);


Preparando Objetos de Comando SQL

A classe Sql é uma classe de preparação de objetos relacionados a comandos Sql. Por exemplo, o método Sql->select() prepara uma instância da classe Zend\Db\Sql\Select, assim como o método Sql->insert() prepara uma instância da classe Zend\Db\Sql\Insert. Esse preparação se dá seguinte forma :


public function select($table = null)
   {
       if ($this->table !== null && $table !== null) {
           throw new Exception\InvalidArgumentException(sprintf(
               ‘This Sql object is intended to work with only the table “%s” provided at construction time.’,
               $this->table
           ));
       }
       return new Select(($table) ?: $this->table);
   }


Dentro da classe Sql possui um atributo chamado table que será usado para criar uma Select, um Insert, um Update ou um Delete ligado a essa tabela. Quando você pede a uma Sql que ela crie um objeto Select por meio de Sql->select(), ela irá criar de acordo com os parâmetros que já existem nela.
Caso você não queira seguir a tabela relacionada à aquela Sql, você pode passar a tabela via parâmetro, e ela será usada ao invés dá já existente internamente, como é possível de ser ver no parâmetro esperado no método acima.

Preparando o Statement

Além de preparar esse objetos essa classe possui o método prepareStatementForSqlObject(PreparableSqlInterface $sqlObject) que recebe esses objetos, que implementam PreparableSqlInterface, e prepara um objeto Statement à partir dos atributos adapter e table. Observe o método:


public function getSqlStringForSqlObject(PreparableSqlInterface $sqlObject, StatementInterface $statement = null)
   {
       $statement = ($statement) ?: $this->adapter->getDriver()->createStatement();
       if ($this->sqlPlatform) {
           $this->sqlPlatform->setSubject($sqlObject);
           $this->sqlPlatform->prepareStatement($this->adapter, $statement);
       } else {
           $sqlObject->prepareStatement($this->adapter, $statement);
       }
       return $statement;
   }


Veja o uso da classe Sql para preparar um Statement:


$sql = new Sql($adapter, ‘produto’);
$select = $sql->select();
$select->where(array(‘id’ => 1));
$statement = $sql->getSqlStringForSqlObject($select);
$statement->execute();


A criação do Statement pode ser feita diretamente do objeto PreparableSqlInterface, que no caso pode ser o Select, Insert, Delete ou Update. Porém, você necessitaria de sempre estar capturando o adapter e inserindo ele. Veja um exemplo:


$select = new Select(‘produto’);
$statement = $adapter->getDriver()->createStatement();
$select->prepareStatement($adapter, $statement);
$statement->execute();


No caso do objeto Sql, ele usaria o adapter já existente nele e recebido em sua instanciação e fica-se livre desse trabalho manual.

Capturando a Sql em String

Quem é capaz de criar um statement à partir de um objeto que representa um comando sql, é capaz de transformar esse tal objeto em um real comando sql no formato string. E é extamente isso que esse método faz.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s