jasperfw/query-builder

动态生成数据库查询的系统

1.1.2 2022-06-16 15:55 UTC

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子句。这允许在动态修改查询时有很大的灵活性。