girgias/query-builder

一个用于构建有效 SQL 查询的库

0.4.0 2019-02-10 15:29 UTC

This package is auto-updated.

Last update: 2024-09-24 05:13:40 UTC


README

Build Status Maintainability Test Coverage

一个流畅的 SQL 查询构建器,它**只**根据请求提供的 SQL 子句构建一个有效的 SQL 查询。

安装

composer require girgias/query-builder

功能

此查询构建器可以使用 ANSI 标准化语法构建各种 SQL 查询,并且与数据库无关。

每种查询类型都有一个自己的类,这些类都继承自基本 Query 类。它们都具有相同的构造函数签名,需要指定要执行查询的表名。

要使用 SelectJoin 类构建带有表连接的 SELECT 查询,下面有一个使用此类的示例。

可以直接将标量值提供给 WHERE 子句和绑定字段。还可以指定将值绑定的命名参数。如果没有提供命名参数,将生成一个随机参数。

要获取带有相关值的命名参数,请使用 getParameters 方法,它将返回一个关联数组 parameter => value

示例

基本的 SELECT 查询

$query = (new \Girgias\QueryBuilder\Select('demo'))
    ->limit(10, 20)
    ->order('published_date')
    ->getQuery();

将输出

SELECT * FROM demo ORDER BY published_date ASC LIMIT 10 OFFSET 20

更复杂的 SELECT 查询

$start = new \DateTime('01/01/2016');
$end = new \DateTime('01/01/2017');
$query = (new \Girgias\QueryBuilder\Select('demo'))
    ->select('title', 'slug')
    ->selectAs('name_author_post', 'author')
    ->whereBetween('date_published', $start, $end)
    ->order('date_published', 'DESC')
    ->limit(25)
    ->getQuery();

将输出

SELECT title, slug, name_author_post AS author FROM demo WHERE date_published BETWEEN '2016-01-01 00:00:00' AND '2017-01-01 00:00:00' ORDER BY date_published DESC LIMIT 25

使用 whereOr 方法的示例

$query = (new \Girgias\QueryBuilder\Select('demo'))
    ->where('author', '=', 'Alice', 'author')
    ->whereOr('editor', '=', 'Alice', 'editor')
    ->getQuery();

将输出

SELECT * FROM demo WHERE (author = :author OR editor = :editor)

UPDATE 查询示例

$query = (new \Girgias\QueryBuilder\Update('posts'))
    ->where('id', '=', 1, 'id')
    ->bindField('title', 'This is a title', 'title')
    ->bindField('content', 'Hello World', 'content')
    ->bindField('date_last_edited', (new \DateTimeImmutable()), 'nowDate')
    ->getQuery();

将输出

UPDATE posts SET title = :title, content = :content, date_last_edited = :now_date WHERE id = :id

带有 INNER JOINSELECT 查询

$query = (new \Girgias\QueryBuilder\SelectJoin('comments', 'posts'))
    ->tableAlias('co')
    ->select('co.user', 'co.content', 'p.title')
    ->joinTableAlias('p')
    ->innerJoin('post_id', 'id')
    ->getQuery();

将输出

SELECT co.user, co.content, p.title FROM comments AS co INNER JOIN posts AS p ON comments.post_id = posts.id

未来范围

可能添加到此库的功能

  • WHERE 子查询

贡献

如果您发现了一个不会抛出运行时异常的无效 SQL 名称,或者请将测试用例添加到 tests/CheckSqlNamesTest.php 文件中。

如果您发现了一个此库返回无效 SQL 查询的示例,请将(或修复)测试用例添加到相关的查询测试用例或如果是通用错误,请使用 tests/QueryTest 文件。

如果应该抛出运行时异常,请添加到相关测试文件或如果是针对 SELECT 查询的特定错误,请添加到 tests/SelectThrowExceptionsTest.php 文件中。

如果您想做出贡献,请复制存储库并使用功能分支。拉取请求非常欢迎。

注意

在做出贡献时,请确保 Psalm 运行无误并且所有单元测试通过。此外,如果您添加了功能,请添加相应的单元测试,至少覆盖 90% 的代码,并且这些测试覆盖任何存在的边缘情况。

链接

许可

此项目中的代码根据 MIT 许可证授权。