Banco de dados Nette

O Nette Database é uma camada de banco de dados poderosa e elegante para PHP, conhecida por sua simplicidade e recursos inteligentes. Ele não requer configuração complexa nem geração de entidades, permitindo que você comece a trabalhar com ele imediatamente.

Com o Nette Database, você pode trabalhar de duas maneiras:

SQL direto

  • Consultas seguras e parametrizadas
  • Controle preciso sobre a estrutura das consultas SQL
  • Ideal para escrever consultas complexas com funções avançadas
  • Otimize o desempenho usando funções SQL específicas

Explorador

  • Desenvolvimento rápido sem escrever SQL
  • Tratamento intuitivo de relacionamentos entre tabelas
  • Otimização automática de consultas
  • Excelente para interações rápidas e convenientes com o banco de dados

Instalação

Você pode fazer download e instalar a biblioteca usando o Composer:

composer require nette/database

Conexão e configuração

Para se conectar ao banco de dados, basta criar uma instância da classe Nette\Database\Connection:

$database = new Nette\Database\Connection($dsn, $user, $password);

O parâmetro $dsn (Data Source Name) segue o mesmo formato usado pelo PDO, por exemplo, host=127.0.0.1;dbname=test. Se a conexão falhar, será lançado o erro Nette\Database\ConnectionException.

No entanto, um método mais conveniente é usar a configuração do aplicativo. Adicione uma seção database e os objetos necessários serão criados, inclusive um painel de banco de dados na Tracy Debug Bar.

database:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: password

Depois disso, o objeto de conexão pode ser recuperado como um serviço do contêiner DI, por exemplo:

class Model
{
	public function __construct(
		private Nette\Database\Connection $database,
	) {
	}
}

Para obter mais informações, consulte configuração do banco de dados.

Duas abordagens para o trabalho com banco de dados

Com o Nette Database, você pode escrever consultas SQL diretamente (abordagem direta) ou deixar que o SQL seja gerado automaticamente (abordagem Explorer). Vamos ver como as duas abordagens resolvem as mesmas tarefas:

Abordagem direta – Escrevendo consultas SQL

// Inserir um registro
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// Recuperar registros: autores de livros
$result = $database->query('
	SELECT authors.*, COUNT(books.id) AS books_count
	FROM authors
	LEFT JOIN books ON authors.id = books.author_id
	WHERE authors.active = 1
	GROUP BY authors.id
');

// Exibir (não é o ideal, gera N consultas adicionais)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Author $author->name has written $author->books_count books:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Abordagem Explorer – Geração automática de SQL

// Inserir um registro
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// Recuperar registros: autores de livros
$authors = $database->table('authors')
	->where('active', 1);

// Exibir (gera automaticamente apenas 2 consultas otimizadas)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Author $author->name has written {$books->count()} books:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

A abordagem Explorer gera e otimiza as consultas SQL automaticamente. No exemplo acima, a abordagem Direct gera N+1 consultas (uma para os autores e outra para os livros de cada autor), enquanto a Explorer executa apenas duas consultas otimizadas – uma para os autores e outra para todos os seus livros.

Você pode combinar livremente as duas abordagens em seu aplicativo, conforme necessário.

Gerenciamento de conexões

Quando você cria um objeto Connection, ele se conecta ao banco de dados automaticamente. Se quiser atrasar a conexão, ative o modo preguiçoso na configuração, definindo lazy, ou faça-o desta forma:

$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);

Para gerenciar a conexão, use os métodos connect(), disconnect() e reconnect().

  • connect() estabelece uma conexão se ela ainda não tiver sido estabelecida e pode lançar um Nette\Database\ConnectionException.
  • disconnect() desconecta-se do banco de dados.
  • reconnect() desconecta e, em seguida, reconecta-se ao banco de dados e também pode lançar um Nette\Database\ConnectionException.

Além disso, você pode monitorar os eventos de conexão usando o evento onConnect, que é uma matriz de retornos de chamada executados após a conexão com o banco de dados.

// Chamado após a conexão com o banco de dados
$database->onConnect[] = function($database) {
	echo "Connected to the database";
};

Barra de depuração Tracy

Se você usa o Tracy, o painel Banco de dados na Barra de depuração é ativado automaticamente. Ele exibe todas as consultas executadas, seus parâmetros, o tempo de execução e o local no código em que foram chamadas.

Bancos de dados compatíveis

O Nette Database é compatível com os seguintes bancos de dados:

Servidor de banco de dados Nome do DSN Suporte ao explorador
MySQL (>= 5.1) mysql YES
PostgreSQL (>= 9.0) pgsql YES
SQLite 3 (>= 3.8) sqlite YES
Oracle oci NÃO SIM
MS SQL (PDO_SQLSRV) sqlsrv SIM  
MS SQL (PDO_DBLIB) mssql NÃO  
ODBC odbc NÃO  
versão: 4.0