VictorWesterlund / libmysqldriver
README
此库提供了对类似 MySQL 的数据库(如 SELECT
、UPDATE
和 INSERT
)的常见操作的抽象方法,并使用方法链来实现各种 MySQL 功能。
例如
MySQL->for(string $table) ->with(?array $model) ->where(?array ...$conditions) ->order(?array $order_by) ->limit(int|array|null $limit) ->select(array $columns): array|bool;
在 MySQL 中相当于以下操作
SELECT $columns FROM $table WHERE $filter ORDER BY $order_by LIMIT $limit;
重要
此库基于 PHP 的 MySQL Improved
扩展,并需要 PHP 8.0 或更高版本。
使用 composer 安装
composer require victorwesterlund/libmysqldriver
use libmysqldriver/MySQL;
示例/文档
可用语句
示例表名:beverages
use libmysqldriver\MySQL; // Pass through: https://php.ac.cn/manual/en/mysqli.construct.php $db = new MySQL($host, $user, $pass, $db);
所有执行方法 select()
、update()
和 insert()
将返回一个 mysqli_result
对象或布尔值。
FOR
MySQL->for( string $table ): self;
所有查询都以链式调用 for(string $table)
方法开始。这将定义当前查询应在哪个数据库表上执行。
示例
MySQL->for("beverages")->select("beverage_type");
SELECT
在 MySQL->for()
之后链式调用 MySQL->select()
以从数据库表中检索列。
将字符串的关联数组、CSV 字符串或 null 传递给此方法以过滤列。
MySQL->select( array|string|null $columns ): mysqli_result|bool;
在大多数情况下,您可能想带有约束条件进行选择。在 select()
之前链式调用 where()
方法以过滤查询
示例
$beverages = MySQL->for("beverages")->select(["beverage_name", "beverage_size"]); // SELECT beverage_name, beverage_size FROM beverages
[
[
"beverage_name" => "cappuccino",
"beverage_size" => 10
],
[
"beverage_name" => "black",
"beverage_size" => 15
],
// ...etc
]
将数组展平为单维
如果您不想得到一个数组数组,而是直接访问每个键值对。在 MySQL->select()
之前任何地方链式调用 MySQL->flatten()
。这将直接返回第一条记录的键值对。
注意 此方法不会为您设置
LIMIT 1
。建议在MySQL->select()
之前任何地方链式调用MySQL->limit(1)
。 您可以在这里了解更多信息
$coffee = MySQL->for("beverages")->limit(1)->flatten()->select(["beverage_name", "beverage_size"]); // SELECT beverage_name, beverage_size FROM beverages WHERE beverage_type = "coffee" LIMIT 1
[ "beverage_name" => "cappuccino", "beverage_size" => 10 ]
INSERT
在 MySQL->for()
之后任何地方链式调用 MySQL->insert()
以向数据库表中追加新行。
将顺序数组传递给 insert()
将假设您希望为表中定义的所有列插入数据。传递一个包含 [column_name => value]
的关联数组以为特定列插入数据(假设其他列有 默认 值定义)。
MySQL->insert( // Array of values to INSERT array $values ): mysqli_result|bool // Returns true if row was inserted
示例
MySQL->for("beverages")->insert([ null, "coffee", "latte", 10 ]); // INSERT INTO beverages VALUES (null, "coffee", "latte", 10);
true
DELETE
在 MySQL->for()
之后任何地方链式调用 MySQL->delete()
以从数据库表中删除一行或多行。
MySQL->delete( array ...$conditions ): mysqli_result|bool // Returns true if at least one row was deleted
此方法至少需要一个 MySQL->where()
语法参数以确定要删除哪一行或哪几行。有关更多信息,请参阅 MySQL->where()
部分。
示例
MySQL->for("beverages")->insert([ null, "coffee", "latte", 10 ]); // INSERT INTO beverages VALUES (null, "coffee", "latte", 10);
true
UPDATE
在 MySQL->for()
之后任何地方链式调用 MySQL->update()
以修改数据库表中的现有行。
MySQL->update( // Key, value array of column names and values to update array $fields, ): mysqli_result|bool; // Returns true if at least 1 row was changed
示例
MySQL->for("beverages")->update(["beverage_size" => 10]); // UPDATE beverages SET beverage_size = 10
true
在大多数情况下,你可能想要更新约束。在 MySQL->update()
之前链接一个 where()
方法来设置约束
WHERE
通过在任何地方链接 MySQL->where()
方法来过滤 MySQL->select()
或 MySQL->update()
方法。同样,MySQL->delete()
执行方法也使用相同的语法来处理其参数。
每个键值对将与其他键值对进行 AND
约束。
MySQL->where( ?array ...$conditions ): self;
示例
$coffee = MySQL->for("beverages")->where(["beverage_type" => "coffee"])->select(["beverage_name", "beverage_size"]); // SELECT beverage_name, beverage_size FROM beverages WHERE (beverage_type = "coffee");
[ [ "beverage_name" => "cappuccino", "beverage_size" => 10 ], [ "beverage_name" => "black", "beverage_size" => 15 ] ]
捕获组
AND
将额外的键值对数组传递给 where()
方法,它们将与其他所有数组进行 AND 比较。
MySQL->where([ "beverage_type" => "coffee", "beverage_size" => 15 ]);
WHERE (beverage_type = 'coffee' AND beverage_size = 15)
OR
通过将一个额外的键值对数组作为参数传递,可以将其与传递的所有其他数组进行 OR 比较。
$filter1 = [ "beverage_type" => "coffee", "beverage_size" => 15 ]; $filter2 = [ "beverage_type" => "tea", "beverage_name" => "black" ]; MySQL->where($filter1, $filter2, ...);
WHERE (beverage_type = 'coffee' AND beverage_size = 15) OR (beverage_type = 'tea' AND beverage_name = 'black')
定义自定义运算符
默认情况下,传递给 where()
的关联数组中的所有值都将被视为 EQUALS
(=) 运算符。
MySQL->where(["column" => "euqals_this_value"]);
将任何键的值设置为另一个关联数组,将允许通过定义你自己的 Operators
进行更“高级”的过滤。
此子数组的键可以是任何 MySQL 运算符字符串,或者是 Operators
枚举中的任何情况 ->value。
MySQL->where([ "beverage_name" => [ Operators::LIKE->value => "%wildcard_contains%" ] ]);
ORDER BY
在 MySQL->select()
语句之前链接 MySQL->order()
方法来按特定列排序
MySQL->order( ?array $order_by ): self;
$coffee = MySQL->for("beverages")->order(["beverage_name" => "ASC"])->select(["beverage_name", "beverage_size"]); // SELECT beverage_name, beverage_size FROM beverages ORDER BY beverage_name ASC
[ [ "beverage_name" => "tea", "beverage_size" => 10 ], [ "beverage_name" => "tea", "beverage_size" => 15 ], // ...etc for "beverage_name = coffee" ]
LIMIT
在 MySQL->select()
语句之前链接 limit()
方法来限制返回的列数
MySQL->limit( ?int $limit, ?int $offset = null ): self;
注意 您也可以通过链接
MySQL->flatten()
将第一个实体简化为一维数组
传递单个整数参数
这将以传递的整数简单地 LIMIT
返回的结果
$coffee = MySQL->for("beverages")->limit(1)->select(["beverage_name", "beverage_size"]); // SELECT beverage_name, beverage_size FROM beverages WHERE beverage_type = "coffee" LIMIT 1
[ [ "beverage_name" => "cappuccino", "beverage_size" => 10 ] ]
传递两个整数参数
这将 OFFSET
和 LIMIT
返回的结果。第一个参数将是 LIMIT
,第二个参数将是它的 OFFSET
。
$coffee = MySQL->for("beverages")->limit(3, 2)->select(["beverage_name", "beverage_size"]); // SELECT beverage_name, beverage_size FROM beverages LIMIT 3 OFFSET 2
[ [ "beverage_name" => "tea", "beverage_size" => 10 ], [ "beverage_name" => "tea", "beverage_size" => 15 ], // ...etc ]
限制影响/返回的数据库列到表模型
在 select()
、update()
或 insert()
方法之前链接并传递一个数组到 MySQL->with()
,以限制哪些列将被返回/影响。它将使用数组的 values,因此可以是顺序的或关联的。
此方法将导致 select()
、update()
和 insert()
忽略在传递的表模型中不存在的任何列。
您可以通过将 null
传递给 MySQL->with()
来删除已设置的表模型。