jasperfw / query-builder
动态生成数据库查询的系统
1.1.2
2022-06-16 15:55 UTC
Requires
- php: ^8.1
- jasperfw/data-access: ^1.0
- psr/log: 1.0.*
Requires (Dev)
- phpunit/phpunit: ~9.0
This package is auto-updated.
Last update: 2024-09-16 20:42:49 UTC
README
这是一个用于构建SQL数据库查询的库。与其他许多需要在整个系统中构建整个查询的查询构建器不同,此库采用混合方法,允许开发人员创建一个复杂的查询并将其作为模板传递,用自动生成的SQL片段替换某些令牌。
功能
- 从头开始生成SQL查询
- 使用生成的SQL片段修改传递的SQL查询
说明
安装
使用composer安装 composer require "jasperfw/query-builder"
基本用法
创建一个基本的select查询
$query = Query::build($dbc) // Pass in the database connection ->setDBC($dbc) // Alteratively, pass the database connection later ->template($hardcodedQuery) // Pass in a basic SQL query that will be modified ->select() // The query type, select, insert, update or delete ->table('schema.tblA', 'tblA') // The base table ->join('schema.tblB', 'b') // A simple join on a table with an alias ->leftJoin('schema.tblC', 'c', 'tblA.index = c.index') // More complex join with condition ->rightJoin('schema.tbld', 'd', 'tblA.index = d.index') ->innerJoin('schema.tblE', 'e', 'tblA.index = e.index') ->outerJoin('schema.tblF', 'f', 'tblA.index = f.index') ->column('table.colA', 'colA', 'bob', 'param') // A column, along with a parameter ->column('table.colB', 'colB', 'steve') // A column that will use a default parameter name ->column('table.colC', null, 'dave') ->where('colA = :a', ['a' => 'b']) // Where condition, with parameters ->sortBy('colA', 'ASC') // Sort, can be called multiple times ->pageNumber(2) // The page, can be ommitted if doing a limit query ->pageSize(50); // Number of records per page
这将生成以下查询(添加换行以提高可读性)
SELECT [table.colA] AS colA, [table.colB] AS colB, [table.colC] AS table.colC FROM schema.tblA tblA, schema.tblB b, schema.tblC c ON tblA.index = c.index, schema.tbld d ON tblA.index = d.index, schema.tblE e ON tblA.index = e.index, schema.tblF f ON tblA.index = f.index WHERE colA = :a ORDER BY colA ASC LIMIT 50,50
将查询对象用作预处理语句
查询对象可以重复使用以提高效率。
$query->prepare(); // Generates a statement to be used $query->parameter('a', 'newValue'); $result = $query->execute(); // Execute the query, returns a JasperFW/DataAccess/ResultSet::ResultSet object
请注意,如果在查询执行后更改了查询结构,由execute
返回的ResultSet对象将被无效化。这些更改包括对列、表、查询类型、分页的更改。参数的更改不会导致这种情况。通常,在执行后更改表结构是不推荐的,而应创建一个新的查询或克隆现有的查询对象。
创建自定义模板
可以使用template()
函数将基本查询作为字符串传递。系统将简单地用生成的SQL片段替换某些令牌。仍然必须调用查询类型设置函数(select()
、insert()
等),以便查询对象生成适当的片段。请注意,可以将模板作为参数传递给查询类型函数,以简化操作。
查询中的以下令牌将被替换
- {{columns}}将被替换为列列表
- {{pagination}}将被替换为限制或限制和偏移量
- {{tables}}将被替换为表和连接列表
- {{where}}将被替换为where子句(s)。默认情况下,这些where子句在"WHERE "之前,但可以通过添加|和替换关键字来覆盖。例如
{{where|AND}}
。空格将自动放置。 - {{sort}}将被替换为排序子句(s)。默认情况下,排序将在"ORDER BY "之前,但如果
{{sort}}
在模板中的现有排序之后,可以通过添加|和新的关键字或逗号来覆盖,例如{{sort|,}}
请注意,如果查询构建器已传递额外的子句,则将添加分页、排序和where子句。这允许在动态修改查询时有很大的灵活性。