enjoys/swatdb

基于 PDO 的简单数据库包装器

1.8.0 2023-12-09 17:31 UTC

README

基于 PDO 的简单数据库包装器

最初(很多年前)这是 DbSimple 库的一个分支 DbSimple,现在只剩下了用于自定义占位符的正则表达式。

一般(备注)

选择

select() 方法

这是 PDO::prepare 和 PDOStatement:execute 的包装

/** @var Enjoys\SwatDB\Wrapper $db */
$sth = $db->select("SELECT * FROM ..."); //return PDOStatement
//далее 
$sth->fetchAll(); //и т.д.

装饰性选择方法

直接返回结果,而不是 PDOStatement

/** @var Enjoys\SwatDB\Wrapper $db */
$db->selectAll("SELECT * FROM ..."); //return array
$db->selectArr("SELECT id, name FROM ..."); //return array keypair id => name
$db->selectCell("SELECT COUNT(*) FROM ..."); //return int|string value
$db->selectCol("SELECT colname FROM ..."); //return array<int, string>

装饰性选择方法的缓存结果

selectAll()selectArr()selectCell()selectCol()selectRow()

use Enjoys\SimpleCache\Cacher;
$db = Enjoys\SwatDB\DB::connect([
    'dsn' => 'sqlite:memory',
    //Любой cacher реализующий интерфейс Psr\SimpleCache\CacheInterface
    'cacher' => new Cacher\Memcached() 
]);

//Альтернативная установка cacher
$db->setCacher(new Cacher\FileCache());

$db->selectAll(300, "SELECT * FROM ..."); //кэширование на 5 минут
//аналогично и на другие методы

插入

插入一行

/** @var Enjoys\SwatDB\Wrapper $db */
$db->insert('table_name', ['column' => 'value', ...]); //Returns the number of rows affected

MySQL:插入行,同时使用 ON DUPLICATE KEY UPDATE(UPSERT)的简单版本

/** @var Enjoys\SwatDB\Wrapper $db */
//INSERT INTO table_name SET (`column`, ...) VALUE ('value', ...) ON DUPLICATE KEY UPDATE column = ?, ...
$db->upsert('table_name', ['column' => 'value', ...]); //Returns the number of rows affected

SQLite:ON CONFLICT(x) DO UPDATE SET(最简单版本)唯一条件是数据数组中第一个应该是键或 PRIMARY 或 UNIQUE

/** @var Enjoys\SwatDB\Wrapper $db */
//INSERT INTO table_name SET (`column`, ...) VALUE ('value', ...) ON CONFLICT(`column`) DO UPDATE SET column = ?, ...
$db->upsert('table_name', ['column' => 'value', ...]); //Returns the number of rows affected

插入多行 INSERT INTO table (column, ...) VALUES (value1, ...), (value2, ...)

/** @var Enjoys\SwatDB\Wrapper $db */
$db->insertMulti('table_name', ['column1', ...], [['value1', ...], ['value2', ...]]); //Returns the number of rows affected

$columns = ['name', 'email'];
$values = [
    ['Вася', 'vasya@example.com'],
    ['Федя', 'fedya@example.com'],
];
//INSERT INTO table_name (name, email) VALUES ('Вася', 'vasya@example.com'), (Федя', 'fedya@example.com')
$cnt = $db->insertMulti('table_name', $columns, $values); //$cnt = 2

/** @var Enjoys\SwatDB\Wrapper $db */
//$db->replace(); in future versions

更新

可以通过 update() 方法调用简单的 UPDATE 场景

UPDATE table SET ... WHERE ...

/** @var Enjoys\SwatDB\Wrapper $db */
//SQL: UPDATE table_name SET 'mycolumn' = `updated` WHERE `id` = 1
$db->update('table_name', ['mycolumn' => 'updated'], 'id = ?d', 1); //Returns the number of rows affected

删除

可以通过 delete() 方法调用简单的 DELETE 场景

/** @var Enjoys\SwatDB\Wrapper $db */
//DELETE FROM table WHERE ...
$db->delete('table_name', 'id = ?d', 10); //Returns the number of rows affected

截断

/** @var Enjoys\SwatDB\Wrapper $db */
//DELETE FROM table WHERE ...
$db->truncate('table_name'); //Work in MySQL, SQLite

创建、删除等,等等

目前尚未实现,所有这些都在计划中,现在最好使用 exec 来实现这些目的

/** @var Enjoys\SwatDB\Wrapper $db */
//$db->create(); //TODO
//$db->drop(); //TODO
//$db->truncate(); //TODO