nette / database
💾 Nette 数据库:具有类似 PDO API 的层,但功能更强大。构建查询、高级连接、MySQL、PostgreSQL、SQLite、MS SQL Server 和 Oracle 驱动程序。
Requires
- php: 8.1 - 8.4
- ext-pdo: *
- nette/caching: ^3.2
- nette/utils: ^4.0
Requires (Dev)
- jetbrains/phpstorm-attributes: ^1.0
- mockery/mockery: ^1.6
- nette/di: ^3.1
- nette/tester: ^2.5
- phpstan/phpstan-nette: ^1.0
- tracy/tracy: ^2.9
- dev-master / 4.0.x-dev
- v4.0.0-RC1
- v3.2.x-dev
- v3.2.4
- v3.2.3
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.x-dev
- v3.1.9
- v3.1.7
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.x-dev
- v3.0.7
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.4.x-dev
- v2.4.12
- v2.4.11
- v2.4.10
- v2.4.9
- v2.4.8
- v2.4.7
- v2.4.6
- v2.4.5
- v2.4.4
- v2.4.3
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.x-dev
- v2.3.11
- v2.3.10
- v2.3.9
- v2.3.8
- v2.3.7
- v2.3.6
- v2.3.5
- v2.3.4
- v2.3.3
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.x-dev
- v2.2.5
- v2.2.4
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- dev-bind-bugfix
This package is auto-updated.
Last update: 2024-09-06 15:11:23 UTC
README
介绍
Nette 提供了一层强大的数据库访问层,使您能够轻松访问数据库。
✅ 轻松编写 SQL 查询
✅ 显着简化了数据检索,无需编写 SQL 查询
✅ 使用高效的查询且不传输不必要的数据库
Nette 数据库核心 是 PDO 的包装,提供了核心功能。
Nette 数据库资源管理器 层有助于您更轻松、更优化地检索数据库数据。
支持我
你喜欢 Nette 数据库吗?你在期待新的功能吗?
谢谢!
安装
推荐的安装方式是通过 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))