Banco de dados Nette

O Nette Database é uma camada de banco de dados poderosa e elegante para PHP, com foco na simplicidade e em recursos inteligentes. Ele oferece duas maneiras complementares de trabalhar com os dados: usando o Explorer para desenvolvimento rápido ou a maneira SQL para controle total das consultas.

Modo SQL

  • 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

Caminho do 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

Bancos de dados compatíveis

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

Servidor de banco de dados Nome DSN Suporte ao Explorer
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  

Duas abordagens para o trabalho com banco de dados

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

Modo SQL – 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";
	}
}

Modo 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 do Explorer gera e otimiza as consultas SQL automaticamente. No exemplo acima, o exemplo do modo SQL gera N+1 consultas (uma para os autores e outra para os livros de cada autor), enquanto o 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.

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(
		// or Nette\Database\Explorer
		private Nette\Database\Connection $database,
	) {
	}
}

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

Criação manual do Explorer

Se não estiver usando o contêiner Nette DI, você poderá criar manualmente uma instância do Nette\Database\Explorer:

// database connection
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// cache storage, implements Nette\Caching\Storage, e.g.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// handles database structure reflection
$structure = new Nette\Database\Structure($connection, $storage);
// defines rules for mapping table names, columns, and foreign keys
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

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.

versão: 4.0