victorwesterlund / libsqlitedriver
用于常见SQLite功能的抽象库
README
此库提供了对SQLite数据库常见操作(如 SELECT
、UPDATE
和 INSERT
)的抽象方法,使用方法链实现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()
来移除已设置的表模型