o-log / php-db
数据库
Requires (Dev)
- o-log/php-router: 2.*
- phpunit/phpunit: 5.5.*
README
该库的主要功能包括
-
具有 CLI、Web 和程序界面的迁移引擎
-
"表空间" 允许每个应用程序拥有多个数据库,同时也允许 composer 模块使用数据库并进行迁移
-
连接器和表空间是单独声明和配置的,这有助于轻松覆盖数据库配置
-
基于 PDO 的轻量级包装,自动连接到服务器
连接器和空间
空间是一组表,这些表位于同一数据库中并一起使用。应用程序可能包含多个模块,每个模块都有自己的表空间或多个空间。例如,php-auth 模块使用 SPACE_PHPAUTH。
每个空间必须分配给应用程序配置中的一个连接器(数据库连接)。所有空间可以共享同一连接,也可以位于不同的数据库和不同的数据库服务器上。
连接器和空间配置示例
class CommonConfig
{
const CONNECTOR_DBDEMO = 'CONNECTOR_DBDEMO';
const SPACE_DBDEMO = 'SPACE_DBDEMO';
static public function init(){
DBConfig::setConnector(
self::CONNECTOR_DBDEMO,
new ConnectorMySQL('127.0.0.1', 'dbdemo', 'root', '1234')
);
DBConfig::setSpace(
self::SPACE_DBDEMO,
new Space(self::CONNECTOR_DBDEMO, __DIR__ . '/../dbdemo.sql')
);
}
}
现实世界应用程序通常具有通用配置,该配置适用于所有实例,以及一些实例配置 - 开发、测试、生产等。
通用配置存储在应用程序存储库中,而实例配置存储在每个实例的本地,并包含在 .gitignore 文件中。
实例配置扩展并覆盖通用配置
class Config
{
static public function init(){
CommonConfig::init();
DBConfig::setConnector(self::CONNECTOR_DBDEMO, new ConnectorMySQL('production.db.host', 'dbdemo', 'demouser', 'some_strong_password'));
}
}
应用程序在入口点内部应用配置,如下所示
\Config\Config::init();
数据库操作
当执行给定连接器的第一次查询时,将自动建立数据库连接。因此,大多数页面可以在不连接到数据库的情况下生成 - 所有数据通常来自缓存。
基本数据库方法位于 DB 类中
static public function readColumn($space_id, $query, $params_arr = array())
从单列读取值到数组。
static public function query($space_id, $query, $params_arr = array())
执行查询并返回 PDO 语句对象。可用于非选择查询(插入、更新等)。
static public function readObject($space_id, $query, $params_arr = array())
将单个数据库记录读取到 stdClass 对象中。
static public function readObjects($space_id, $query, $params_arr = array(), $field_name_for_keys = '')
用于从数据库中读取多条记录到 stdClass 对象数组中。
每个方法都接收数据库空间 ID、带有参数占位符的查询字符串和参数值数组。
迁移
迁移由 vendor/bin/migrate 工具执行。
一个空间的所有迁移存储在单个文件中,每行一个 SQL 查询。迁移文件名传递给空间配置。
查询将按照它们在文件中的顺序执行。您可以使用 php-model 工具创建迁移,或手动编写迁移。
事务
正确的事务只能在单个数据库连接中进行,因此您只能在具有相同连接器的空间之间使用事务和外键。
例如,如果您的应用程序模型从 php-auth 引用 User 模型 - 您必须将相同的连接器分配给您的应用程序表空间和 php-auth 表空间。
使用模块和配置多个空间
每个与数据库一起工作的模块都有自己的表空间 ID 和迁移文件。您必须配置模块的相应空间才能使其工作。
DBConfig::setConnector(self::CONNECTOR_DEMO, new ConnectorMySQL('127.0.0.1', 'phpstorage', 'root', '1234'));
DBConfig::setSpace(AuthConfig::SPACE_PHPAUTH, new Space(self::CONNECTOR_DEMO, __DIR__ . '/../vendor/o-log/php-auth/db_phpauth.sql'));
DBConfig::setSpace(StorageConstants::SPACE_PHPSTORAGE, new Space(self::CONNECTOR_DEMO, __DIR__ . '/../db_phpstorage.sql'));
必须在应用程序空间之前注册模块空间,以便迁移器首先创建模块表,然后创建应用程序表,这对于应用程序表可能引用模块表非常重要。