VictorWesterlund/libmysqldriver

此软件包已被废弃,不再维护。作者建议使用 vlw/mysql 软件包。

常用 mysqli 特性的抽象库

3.6.1 2024-04-29 08:17 UTC

README

此库提供了对类似 MySQL 的数据库(如 SELECTUPDATEINSERT)的常见操作的抽象方法,并使用方法链来实现各种 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
  ]
]

传递两个整数参数

这将 OFFSETLIMIT 返回的结果。第一个参数将是 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() 来删除已设置的表模型。