midorikocak / nanodb
Nano DB 是一个小巧的 PHP 库,允许您轻松定义可用的仓库。
v1.2.6
2020-03-05 22:37 UTC
Requires
- php: ~7.4
- ext-json: *
- ext-pdo: *
- midorikocak/arraytools: ^1.0.2
- midorikocak/querymaker: ^1.4.3
- phpunit/php-token-stream: ^4.0
Requires (Dev)
- opsway/psr12-strict-coding-standard: ^0.3.0
- phpunit/phpunit: >=8.0
- squizlabs/php_codesniffer: ^3.5
README
Nano DB
Nano DB 是一个小巧的 PHP 库,允许您轻松定义可用的仓库。
该库中有 3 个实用类和 1 个示例。让我们从基础知识开始。
要求
严格需要 PHP 7.4。
安装
通过 Composer
$ composer require midorikocak/nanodb
使用方法
数据库
要使用数据库库,只需通过 pdo 注入即可。
use midorikocak\nanodb\Database; $pdo = new PDO('sqlite::memory:'); $db = new Database($pdo);
或者,如果您想使用查询对象,也可以注入它。
use midorikocak\nanodb\Database; $pdo = new PDO('sqlite::memory:'); $query = new QueryMaker(); $db = new Database($pdo, $query);
操作是链式的。
$db->insert($tableName, $data)->execute(); $lastInsertId = $db->lastInsertId(); $insertedItem = $db->select($tableName)->where('id', $lastInsertId)->fetch();
选择
如果找到,则返回所需的数据。如果没有找到,则返回空数组。
print_r($db->select($tableName)->where('id', $id)->fetch());
示例输出
Array
(
[id] => 1
[username] => username
[email] => email@email.com
[password] => 123456789
)
按顺序
使用 orderBy($fieldName)
方法来排序结果。
print_r($db->select($tableName)->where('id', $id)->orderBy('id', 'DESC')->fetch());
偏移量和限制
使用 limit($limit)
和 offset($offset)
方法来限制和偏移结果。
print_r($db->select($tableName)->where('id', $id)->limit(1)->offset(1)->fetch());
插入
使用数据数组插入。验证是你的责任。
$db->select($tableName)->insert($tableName, $data)->executre();
更新
使用数据数组插入。同样,验证是你的责任。如果 id 不存在,则抛出异常。
$db->update($tableName, $data)->update($tableName, $data)->where('id', $id)->execute();
删除
返回受影响的行数。如果 id 不存在,则抛出异常。
$db->delete($tableName)->delete('id', $id)->execute();
RepositoryInterface
仓库接口是仓库的接口。
<?php declare(strict_types=1); namespace midorikocak\nanodb; use midorikocak\querymaker\QueryInterface; interface RepositoryInterface { public function read(string $id); public function readAll(?QueryInterface $query = null): array; public function save($item); public function remove($data): int; }
如果您想使用数组与数据库交互,可以使用数组仓库。
use midorikocak\nanodb\ArrayRepository; $tableName = 'users'; $schema = [ 'username'=>'string', 'password'=>'string', 'email'=>'email' ]; $repository = new ArrayRepository($tableName, $this->db, $schema);
在这里,$schema
数组是一个简单的可选数组,用于 Array 验证器,在每个输入数据上都会进行检查。您可以通过扩展 ArrayValidator
类来覆盖它。
类仓库
假设您有一个简单的用户类。
<?php declare(strict_types=1); class User { private ?string $id; private string $username; private string $email; private string $password; public function __construct(?string $id, string $username, string $email, string $password) { $this->id = $id; $this->username = $username; $this->password = $password; $this->email = $email; } public function getId(): ?string { return $this->id; } public function setId(string $id) { $this->id = $id; } public function getUsername(): string { return $this->username; } public function setUsername(string $username) { $this->username = $username; } public function getEmail(): string { return $this->email; } public function setEmail(string $email) { $this->email = $email; } public function getPassword(): string { return $this->password; } public function setPassword(string $password) { $this->password = $password; } }
您可以通过实现 RepositoryInterface
来创建一个 Users
仓库。
<?php declare(strict_types=1); namespace midorikocak\nanodb; use Exception; use midorikocak\querymaker\QueryInterface; use function array_map; class Users implements RepositoryInterface { private DatabaseInterface $db; public function __construct(DatabaseInterface $db) { $this->db = $db; } /** * @return User */ public function read(string $id) { $data = $this->db->select('users')->where('id', $id)->fetch(); if (!$data) { throw new Exception('not found'); } return self::fromArray($data); } public function readAll(?QueryInterface $query = null): array { if ($query !== null) { $db = $this->db->query($query); } else { $db = $this->db->select('users'); } $db->execute(); return array_map(fn($data) => User::fromArray($data), $db->fetchAll()); } /** * @param User $user * @return User */ public function save($user) { if ($user->getId()) { $id = $user->getId(); $userData = self::toArray($user); unset($userData['id']); $this->db->update('users', $userData)->where('id', $id)->execute(); return $user; } $this->db->insert('users', self::toArray($user))->execute(); $lastInsertId = $this->db->lastInsertId(); $user->setId($lastInsertId); return $user; } /** * @param User $user */ public function remove($user): int { $id = $user->getId(); $this->db->delete('users')->where('id', $id)->execute(); return $this->db->rowCount(); } /** * @param User $user * @return User */ public static function fromArray(array $array): User { if (!isset($array['id'])) { $array['id'] = null; } return new User($array['id'], $array['username'], $array['email'], $array['password']); } /** * @param User $user * @return array */ public static function toArray(User $user): array { $toReturn = [ 'username' => $user->getUsername(), 'email' => $user->getEmail(), 'password' => $user->getPassword(), ]; if ($user->getId()) { $toReturn['id'] = $user->getId(); } return $toReturn; } }
动机和警告
主要是教育目的。请自行承担风险。
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG。
测试
$ composer test
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT。
安全
如果您发现任何安全问题,请通过电子邮件 mtkocak@gmail.com 联系,而不是使用问题跟踪器。
致谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。