midorikocak/nanodb

Nano DB 是一个小巧的 PHP 库,允许您轻松定义可用的仓库。

v1.2.6 2020-03-05 22:37 UTC

This package is auto-updated.

Last update: 2024-09-08 06:59:19 UTC


README

nano API

Nano DB

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

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

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全

如果您发现任何安全问题,请通过电子邮件 mtkocak@gmail.com 联系,而不是使用问题跟踪器。

致谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件