victorwesterlund/libsqlitedriver

用于常见SQLite功能的抽象库

2.0.0 2024-06-18 09:34 UTC

This package is auto-updated.

Last update: 2024-09-18 10:17:18 UTC


README

此库提供了对SQLite数据库常见操作(如 SELECTUPDATEINSERT)的抽象方法,使用方法链实现SQLite的各种功能。

例如

SQLite->for(string $table)
  ->with(?array $model)
  ->where(?array ...$conditions)
  ->order(?array $order_by)
  ->limit(int|array|null $limit)
  ->select(array $columns): array|bool;

这相当于以下SQLite中的内容

SELECT $columns FROM $table WHERE $filter ORDER BY $order_by LIMIT $limit;

重要

此库基于PHP的SQLite3扩展构建,并需要PHP 8.0或更高版本。

通过composer安装

composer require victorwesterlund/libSQLitedriver
use libsqlitedriver/SQLite;

示例/文档

可用语句

示例表名:beverages

use libSQLitedriver\SQLite;

// Pass through: https://php.ac.cn/manual/en/sqlite3.construct.php
$db = new SQLite($filename = ":memory:");

所有执行方法 select()update()insert() 将返回一个 SQLite3Result 对象或布尔值。

FOR

SQLite->for(
  string $table
): self;

所有查询都以链式调用 for(string $table) 方法开始。这将定义当前查询应在哪个数据库表上执行。

示例

SQLite->for("beverages")->select("beverage_type");

SELECT

SQLite->for()之后链式调用 SQLite->select() 以从数据库表检索列。

将字符串的关联数组、CSV字符串或null传递给此方法以过滤列。

SQLite->select(
  array|string|null $columns
): SQLite3Result|bool;

在大多数情况下,您可能希望使用约束来选择。在 select() 之前链式调用 where() 方法以过滤查询。

示例

$beverages = SQLite->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
]

将数组展平到单维

如果您不想得到一个数组数组,而希望直接访问每个键值对。在任何地方链式调用 SQLite->flatten()SQLite->select() 之前。这将直接返回第一条记录的键值对。

注意 此方法不会为您设置 LIMIT 1。建议在任何地方链式调用 SQLite->limit(1)SQLite->select() 之前。 您可以在此处了解更多信息

$coffee = SQLite->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

SQLite->for()之后链式调用 SQLite->insert() 以向数据库表添加新行。

将顺序数组传递给 insert() 将假设您希望为表中的所有定义列插入数据。传递一个关联数组 [column_name => value] 以插入特定列的数据(假设其他列已定义了默认值)。

SQLite->insert(
  // Array of values to INSERT
  array $values
): SQLite3Result|bool
// Returns true if row was inserted

示例

SQLite->for("beverages")->insert([
  null,
  "coffee",
  "latte",
  10
]);
// INSERT INTO beverages VALUES (null, "coffee", "latte", 10);
true

DELETE

SQLite->for()之后链式调用 SQLite->delete() 以从数据库表中删除行或行。

SQLite->delete(
  array ...$conditions
): SQLite3Result|bool
// Returns true if at least one row was deleted

此方法至少需要一个以SQLite->where()语法编写的参数来决定要删除哪一行或哪几行。有关更多信息,请参阅SQLite->where()部分。

示例

SQLite->for("beverages")->insert([
  null,
  "coffee",
  "latte",
  10
]);
// INSERT INTO beverages VALUES (null, "coffee", "latte", 10);
true

UPDATE

SQLite->for()之后链式调用 SQLite->update() 以修改数据库表中的现有行。

SQLite->update(
  // Key, value array of column names and values to update
  array $fields,
): SQLite3Result|bool;
// Returns true if at least 1 row was changed

示例

SQLite->for("beverages")->update(["beverage_size" => 10]); // UPDATE beverages SET beverage_size = 10
true

在大多数情况下,你可能希望针对约束进行更新。在调用 SQLite->update() 方法之前,先链式调用一个 where() 方法来设置约束

WHERE

通过在 SQLite->select()SQLite->update() 方法之前任何位置链式调用 SQLite->where() 方法来过滤方法。同样,SQLite->delete() 执行方法也使用相同的语法来处理其参数。

每个键值对之间都将使用 AND 约束。

SQLite->where(
  ?array ...$conditions
): self;

示例

$coffee = SQLite->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 比较。

SQLite->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"
];

SQLite->where($filter1, $filter2, ...);
WHERE (beverage_type = 'coffee' AND beverage_size = 15) OR (beverage_type = 'tea' AND beverage_name = 'black')

ORDER BY

SQLite->select() 语句之前链式调用 SQLite->order() 方法来按特定列排序

SQLite->order(
  ?array $order_by
): self;
$coffee = SQLite->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

SQLite->select() 语句之前链式调用 limit() 方法来限制返回的列的数量

SQLite->limit(
  ?int $limit,
  ?int $offset = null
): self;

注意 你也可以通过链式调用 SQLite->flatten() 将第一个实体简化为一维数组

传递单个整数参数

这将简单地返回传递的整数作为限制的结果

$coffee = SQLite->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
  ]
]

传递两个整数参数

这将返回偏移量和限制的结果。第一个参数是限制值,第二个参数是其偏移量。

$coffee = SQLite->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() 方法之前链式调用并传递一个数组给 SQLite->with() 来限制返回/受影响的列。它将使用数组的值,因此可以是顺序的或关联的。

此方法将使 select()update()insert() 忽略任何不在传递的表模型中出现的列。

你可以通过将 null 传递给 SQLite->with() 来移除已设置的表模型