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.