nette/database

💾 Nette 数据库:具有类似 PDO API 的层,但功能更强大。构建查询、高级连接、MySQL、PostgreSQL、SQLite、MS SQL Server 和 Oracle 驱动程序。


README

Nette Database

Downloads this Month Tests Latest Stable Version License

 

介绍

Nette 提供了一层强大的数据库访问层,使您能够轻松访问数据库。

✅ 轻松编写 SQL 查询
✅ 显着简化了数据检索,无需编写 SQL 查询
✅ 使用高效的查询且不传输不必要的数据库

Nette 数据库核心 是 PDO 的包装,提供了核心功能。

Nette 数据库资源管理器 层有助于您更轻松、更优化地检索数据库数据。

 

支持我

你喜欢 Nette 数据库吗?你在期待新的功能吗?

Buy me a coffee

谢谢!

 

安装

推荐的安装方式是通过 Composer

composer require nette/database

它需要 PHP 版本 8.1,并支持 PHP 8.4。

 

用法

这只是文档的一部分。请参阅我们的网站

 

数据库核心

要创建新的数据库连接,只需创建一个新的 Nette\Database\Connection 类实例

$database = new Nette\Database\Explorer($dsn, $user, $password); // the same arguments as uses PDO

连接允许您通过调用 query 方法轻松查询数据库

$database->query('INSERT INTO users', [ // an array can be a parameter
	'name' => 'Jim',
	'created' => new DateTime, // or a DateTime object
	'avatar' => fopen('image.gif', 'r'), // or a file
], ...); // it is even possible to use multiple inserts

$database->query('UPDATE users SET ? WHERE id=?', $data, $id);
$database->query('SELECT * FROM categories WHERE id=?', 123)->dump();

 

数据库资源管理器

Nette 数据库资源管理器层有助于您更轻松、更优化地检索数据库数据。主要态度是只从一张表中检索数据,并且一次检索所有数据。数据被检索到 ActiveRow 实例中。通过关系连接的其他表中的数据通过其他查询提供 - 这由数据库资源管理器层本身维护。

让我们看看一个常见的用例。您需要检索书籍及其作者。这是一种常见的 1:N 关系。常用的实现方式是通过带有表连接的单个 SQL 查询来检索数据。第二种可能性是分别检索数据,对获取书籍执行一个查询,然后通过另一个查询(例如在您的 foreach 循环中)获取每本书的作者。这可以很容易地优化为只执行两个查询,一个用于书籍,另一个用于所需的作者 - 这正是 Nette 数据库资源管理器所做的方式。

选择数据从表开始,只需在 Nette\Database\Explorer 对象上调用 $explorer->table()。获取它的最简单方法在这里描述,但如果单独使用 Nette 数据库资源管理器,则可以手动创建

$selection = $explorer->table('book'); // db table name is "book"

我们可以简单地遍历选择并传递所有书籍。行以 ActiveRow 实例的形式检索;您可以从它们的属性中读取行数据。

$books = $explorer->table('book');
foreach ($books as $book) {
	echo $book->title;
	echo $book->author_id;
}

通过 get() 方法获取特定的一行,该方法直接返回一个 ActiveRow 实例。

$book = $explorer->table('book')->get(2); // returns book with id 2
echo $book->title;
echo $book->author_id;

处理关系

$books = $explorer->table('book');

foreach ($books as $book) {
	echo 'title:      ' . $book->title;
	echo 'written by: ' . $book->author->name;

	echo 'tags: ';
	foreach ($book->related('book_tag') as $bookTag) {
		echo $bookTag->tag->name . ', ';
	}
}

您会对数据库层的效率感到满意。上面的例子执行了恒定的查询数量,请看下面的 4 个查询

SELECT * FROM `book`
SELECT * FROM `author` WHERE (`author`.`id` IN (11, 12))
SELECT * FROM `book_tag` WHERE (`book_tag`.`book_id` IN (1, 4, 2, 3))
SELECT * FROM `tag` WHERE (`tag`.`id` IN (21, 22, 23))

如果您使用缓存(默认开启),则不会不必要地查询任何列。在第一次查询后,缓存将存储已使用的列名,Nette 数据库浏览器将只运行包含所需列的查询

SELECT `id`, `title`, `author_id` FROM `book`
SELECT `id`, `name` FROM `author` WHERE (`author`.`id` IN (11, 12))
SELECT `book_id`, `tag_id` FROM `book_tag` WHERE (`book_tag`.`book_id` IN (1, 4, 2, 3))
SELECT `id`, `name` FROM `tag` WHERE (`tag`.`id` IN (21, 22, 23))

继续....