bmware / dmk
MySQLi 数据库工具包
Requires
- php: >=7
Requires (Dev)
- phpunit/phpunit: ^7.5
This package is auto-updated.
Last update: 2024-09-29 04:49:49 UTC
README
BMware 数据库管理套件
composer: composer require bmware/dmk
目前有2个基本设置示例,第一个是常规数据库设置
require_once("vendor/autoload.php"); use config\DatabaseConfig; $database = DatabaseConfig::create([ "servername" => "localhost", "username" => "root", "password" => "", "useExistingDatabase" => true, "databaseName" => "bmbuilder_testing" ]);
DatabaseConfig::create() 接受一个参数数组。
- servername:您本地/测试/生产站点的基准URL
- username:数据库的用户名
- password:数据库的密码
- useExistingDatabase:布尔值,选择是否使用现有的数据库,还是创建一个新的数据库
- databaseName:您想使用的数据库的名称,如果 useExistingDatabase 为 false,则该名称成为新数据库的名称。留空以使用默认数据库名称:bmbuilder_testing
第二个是基于 WordPress 的设置。
require_once("vendor/autoload.php"); use config\WordpressDatabaseConfig; $database = WordpressDatabaseConfig::create();
除了设置之外,使用任一类的方式相同。然而,在底层,WordPressDatabase 使用全局 wpdb 向数据库发出查询
查询
目前该库预先构建了4个查询操作
- 创建
use queries\CreateQuery; $database->define(function($context){ return CreateQuery::create("test") ->select("email", "location", "name") ->values("boydvree@BMware.com", "Netherlands", "boyd") ->values("someNoob@BMware.com", "noobland", "noob") ->endQuery(); });
- 读取
use queries\ReadQuery; $database->define(function($context){ return ReadQuery::create("test") ->select() ->whereEquals("email", "boydvree@BMware.com") ->union() ->select() ->whereLessThan("email", "boydvre@BMware.com", true) ->endQuery(); });
- 更新
use queries\UpdateQuery; $database->define(function($context){ return UpdateQuery::create("test") ->select("email") ->values("boydvree@BMware.com") ->whereEquals("email", "boydvree@BMware.com", true) ->endQuery(); });
- 删除
use queries\DeleteQuery; $database->define(function($context){ return DeleteQuery::create("test") ->whereGreateThan("ID", "10") ->endQuery(); });
每个操作都有自己的查询对象及其修饰符。所有插入和 WHERE 语句都将自动转换为预处理器语句。
每个对象都有 create(string $table) 函数,该函数设置表并返回给定查询对象的实例。
每个对象都有 union(string $table = "") 函数,如果使用它,则创建给定查询对象的新实例,并返回它。然后在查询的末尾将它们放在一起使用 union。如果没有提供,将使用上一个查询的表名
CreateQuery、ReadQuery 和 DeleteQuery 有 3 个 "where" 函数,分别是
whereEquals(string $field, string $value, bool $notEquals = false):将在查询中添加"WHERE $field (!)= $value"whereGreaterThan(string $field, string $value, bool $orEqualTo = false):将在查询中添加"WHERE $field >(=) $value"whereLessThan(string $field, string $value, bool $orEqualTo = false):将在查询中添加"WHERE $field <(=) $value"
ReadQuery 有一个 join 函数,该函数接受 3 个参数,用于生成一个 join SQL 语句
string $table要连接到第一个表右侧的表string $conditionOne用于连接两个字段的第一字段string $condtionTwo用于连接两个字段的第二字段
define 函数也接受查询作为参数
$database->define( ReadQuery::create("test") ->select() ->whereEquals("email", "boydvree@BMware.com") ->union() ->select() ->whereLessThan("email", "boydvre@BMware.com", true) ->endQuery() );
另外,可以按以下方式创建自定义查询
$database->define(function($context){ return $context("excecuteQuery", "SELECT * FROM `users`") });
请注意,当使用函数方法时,需要返回查询
DatabaseResult
每个查询结果都将返回一个 DatabaseResult 对象,该对象包含成功消息或查询的行。您还将从该点开始访问各种不同的结果修饰符,以便从众多结果中选择一个。这将允许您一次性查询所有数据,并在任何给定时间点内部选择您想要看到的内容。数据永远不会被覆盖,因此您始终有查询的结果
结果修饰符的工作示例
$result->setUseModified(true) //tell the object to use the modifiedRow as the base for the next call $result->getRowsByFieldValue("email", "hello@world.code")->selectFields("id")->getRows("modified"); // you can chain as many as you want toghetter however some might clash with eachother foreach(DatbaseResult $result as $row){ //excecute function here }
$result->setUseModified(boolean $value) 设置 $result->useModified 变量值为 $value,这将使所有修改函数以 $result->modifiedRows 作为函数的基准点
$result->getUseModified() 返回当前 $result->useModified 的值
$result->getRowByIndex(int $index) 返回指定 $index 的行
$result->getRowsByFieldValue(string $field, string $value) 返回所有 $field 字段值与 $value 相同的行
$result->selectfields(string ...$fields) 仅返回此函数中指定的字段
$result->getRows(string $flag) 根据 $flag 的值返回前一次修改的行、基础行或当前修改的行,标志包括:表示前一次修改行的 "previous" 或表示当前修改行的 "modified",其他任何值都将仅返回查询的基础结果
有话要说
在我看来,使这个库变得“好”的是查询定义是在函数中完成的。这意味着你可以让你的编程精神自由发挥,并在例如模式上设置所有类型的条件检查。在查询执行之前,这意味着你可以在查询执行之前做几乎所有的事情。
规划
- 迁移支持,使迁移变得容易进行
- 模式支持,创建一个标准模式定义,可以自动转换为创建迁移
- CLI 工具,一个 CLI 工具,使迁移更容易。
欢迎提出任何建议。