lucinda / queries
根据官方标准或其供应商特定的派生生成的 SQL 语句的 API
Requires
- php: ^8.1
Requires (Dev)
- lucinda/unit-testing: ^2.0
README
目录
关于
此 API 的目的是根据 SQL 标准或其供应商特定的派生自动化生成 SQL 语句(查询)。API 完全符合 PSR-4 标准,仅需要 PHP 8.1+ 解释器。要快速了解其工作原理,请查看
- 安装:描述如何在您的计算机上安装 API
- 单元测试:API 具有百分之百的单元测试覆盖率,使用 UnitTest API 而不是 PHPUnit 以获得更大的灵活性
- 示例:显示 API 功能示例
内部所有类都使用 Lucinda\Query 命名空间!
安装
要安装此 API,您只需进入项目根目录,然后在控制台运行此命令
composer require lucinda/queries
安装完成后,您就可以生成查询。每个标准 SQL 语句对应一个或多个类
- SELECT:
- Lucinda\Query\Select:封装单个 SELECT 语句(例如:SELECT id FROM table)
- Lucinda\Query\SelectGroup:封装由 SET 操作符连接的 SELECT 语句组(例如:(SELECT id FROM table1)UNION(SELECT id FROM table2))
- INSERT:
- Lucinda\Query\Insert:封装 INSERT INTO ... VALUES 语句(例如:INSERT INTO table (id, name) VALUES (1, 'asd')
- Lucinda\Query\InsertSelect:封装 INSERT INTO ... SELECT 语句(例如:INSERT INTO table (id, name) SELECT id, name FROM table2)
- UPDATE:
- Lucinda\Query\Update:封装 UPDATE 语句(例如:UPDATE users SET name='Lucian' WHERE id=18)
- DELETE:
- Lucinda\Query\Delete:封装 DELETE 语句(例如:DELETE FROM users WHERE id=18)
- TRUNCATE:
- Lucinda\Query\Truncate:封装 TRUNCATE 语句(例如:TRUNCATE TABLE users)
对于实现 SQL 标准的每个供应商,您可以使用上述内容或其供应商特定的派生。MySQL 供应商已支持
- SELECT:
- Lucinda\Query\Vendor\MySQL\Select:扩展 Lucinda\Query\Select 以支持供应商特定的操作(例如:SQL_NO_CACHE)
- INSERT:
- Lucinda\Query\Vendor\MySQL\Insert:扩展 Lucinda\Query\Insert 以支持供应商特定的操作(例如:IGNORE)
- Lucinda\Query\Vendor\MySQL\InsertSelect:扩展 Lucinda\Query\InsertSelect 以支持供应商特定的操作(例如:IGNORE)
- Lucinda\Query\Vendor\MySQL\InsertSet:封装特定供应商的INSERT INTO ... SET语句(例如:INSERT INTO table (id, name) SET id=1, name='Lucian')
- REPLACE:
- Lucinda\Query\Vendor\MySQL\Replace:扩展Lucinda\Query\Insert以支持特定供应商的REPLACE INTO ... VALUES语句
- Lucinda\Query\Vendor\MySQL\ReplaceSelect:扩展Lucinda\Query\InsertSelect以支持特定供应商的REPLACE INTO ... SELECT语句
- Lucinda\Query\Vendor\MySQL\ReplaceSet:封装特定供应商的REPLACE INTO ... SET语句(例如:REPLACE INTO table (id, name) SET id=1, name='Lucian')
- UPDATE
- Lucinda\Query\Vendor\MySQL\Update:扩展Lucinda\Query\Update以支持特定供应商的操作(例如:IGNORE)
- DELETE
- Lucinda\Query\Vendor\MySQL\Delete:扩展Lucinda\Query\Delete以支持特定供应商的操作(例如:IGNORE)
以上每个或单独调用的子句都实现\Stringable
,该实现通过__toString()
方法将语句/子句转换为SQL。
单元测试
有关测试和示例,请检查API源代码中的以下文件/文件夹
- test.php:在控制台运行单元测试
- unit-tests.xml:设置单元测试
- tests:来自
src
文件夹的类的单元测试 - tests_drivers:来自
drivers
文件夹的类的单元测试
注意:超全局函数__toString()
(由语句和子句使用)通过toString()
单元测试方法进行测试。由于返回类型为字符串而不是Result,因此它们不能通过单元测试进行镜像,所以它们将给出:无效的单元测试响应
示例
要查看每个类如何使用的示例,请检查tests或tests_drivers文件夹中的单元测试!简单示例
$statement = new \Lucinda\Query\Select("users", "t1"); $statement->fields(["t3.name"]); $statement->joinInner("user_departments", "t2")->on(["t1.id"=>"t2.user_id"]); $statement->joinInner("departments", "t3")->on(["t2.department_id"=>"t3.id"]); $statement->where(["t1.id"=>":id"]); $statement->orderBy(["t3.name"]);
封装
SELECT t3.name FROM users AS t1 INNER JOIN user_departments AS t2 ON t1.id = t2.user_id INNER JOIN departments AS t3 ON t2.department_id = t3.id WHERE t1.id = :id ORDER BY t3.name
参考指南
Select类
Lucinda\Query\Select通过以下公共方法封装标准的SELECT语句
SelectGroup类
Lucinda\Query\SelectGroup通过以下公共方法封装由SET运算符(例如:UNION)连接的SELECT语句列表
Insert类
Lucinda\Query\Insert通过以下公共方法封装标准的INSERT INTO VALUES语句
InsertSelect类
Lucinda\Query\InsertSelect通过以下公共方法封装标准的INSERT INTO SELECT语句
Update类
Lucinda\Query\Update 通过以下公共方法封装了标准的 UPDATE 语句
类 Delete
Lucinda\Query\Delete 通过以下公共方法封装了标准的 DELETE 语句
类 Truncate
Lucinda\Query\Truncate 通过以下公共方法封装了标准的 TRUNCATE 语句
类 MySQL Select
Lucinda\Query\Vendor\MySQL\Select 在 Lucinda\Query\Select 的基础上通过以下额外方法封装了 MySQL SELECT 语句
除了上述操作外,还可以使用 where 方法
- Lucinda\Query\Vendor\MySQL\Clause\Condition 以支持正则表达式条件和全文搜索
- Lucinda\Query\Vendor\MySQL\Operator\Logical 以支持 XOR 操作符
类 MySQL Insert
Lucinda\Query\Vendor\MySQL\Insert 在 Lucinda\Query\Insert 的基础上通过以下额外方法封装了 MySQL INSERT INTO VALUES 语句
类 MySQL InsertSelect
Lucinda\Query\Vendor\MySQL\InsertSelect 在 Lucinda\Query\InsertSelect 的基础上通过以下额外方法封装了 MySQL INSERT INTO SELECT 语句
类 MySQL InsertSet
Lucinda\Query\Vendor\MySQL\InsertSet 通过以下公共方法封装了 MySQL INSERT INTO SET 语句
类 MySQL Replace
Lucinda\Query\Vendor\MySQL\Replace 在 Lucinda\Query\Insert 的基础上封装了 MySQL REPLACE INTO VALUES 语句,没有额外的公共方法,只是将 INSERT 替换为 REPLACE。
类 MySQL ReplaceSelect
Lucinda\Query\Vendor\MySQL\ReplaceSelect 在 Lucinda\Query\InsertSelect 的基础上封装了 MySQL REPLACE INTO SELECT 语句,没有额外的公共方法,只是将 INSERT 替换为 REPLACE。
类 MySQL ReplaceSet
Lucinda\Query\Vendor\MySQL\ReplaceSet 通过以下公共方法封装了 MySQL REPLACE INTO SET 语句
类 MySQL Update
Lucinda\Query\Vendor\MySQL\Update 在 Lucinda\Query\Update 的基础上通过以下额外方法封装了 MySQL UPDATE 语句
除了上述操作外,还可以使用 where 方法
- Lucinda\Query\Vendor\MySQL\Clause\Condition 以支持正则表达式条件和全文搜索
- Lucinda\Query\Vendor\MySQL\Operator\Logical 以支持 XOR 操作符
类 MySQL Delete
Lucinda\Query\Vendor\MySQL\Delete 在 Lucinda\Query\Delete 的基础上通过以下额外方法封装了 MySQL DELETE 语句
除了上述操作外,还可以使用 where 方法
- Lucinda\Query\Vendor\MySQL\Clause\Condition 以支持正则表达式条件和全文搜索
- Lucinda\Query\Vendor\MySQL\Operator\Logical 以支持 XOR 操作符