finesse/query-scribe

轻量级 SQL 查询构建器,专为可扩展性和灵活性而设计

v0.9.3 2019-01-19 03:47 UTC

README

Latest Stable Version Total Downloads PHP from Packagist Test Status Maintainability Test Coverage

提供方便的对象语法来构建 SQL 查询。将查询编译为带绑定值的 SQL 文本。不执行数据库查询。

$query = (new Query)
    ->from('posts')
    ->where('level', '>', 3)
    ->whereIn('category_id', function ($query) {
        $query
            ->addSelect('id')
            ->from('categories')
            ->where('categories.name', 'Interesting');
    })
    ->where(new Raw('MONTH(date)'), 4)
    ->orderBy('date', 'desc')
    ->limit(10);
    
$prefixer = new TablePrefixer('demo_');
$grammar = new MySQLGrammar();
$compiled = $grammar->compile($query->apply($prefixer));

echo $compiled->getSQL();
/*
    SELECT *
    FROM `demo_posts`
    WHERE
        `level` > ? AND
        `category_id` IN (
            SELECT `id`
            FROM `demo_categories`
            WHERE `demo_categories`.`name` = ?
        ) AND
        (MONTH(date)) = ?
    ORDER BY `date` DESC
    LIMIT ?
 */

echo $compiled->getBindings();
/*
    [3, 'Interesting', 4, 10]
 */

要对数据库执行编译后的查询,请使用数据库连接器,如 PDOMicroDBDBAL,或使用现成的数据库抽象,如 MiniDBWired

关键特性

  • 构建器只有一个职责:构建 SQL。
  • 设计用于进一步扩展。您可以在其上构建数据库工具或 ORM 而不会遇到主要问题。示例将很快提供。
  • 非常灵活。您几乎可以在任何地方传递原始 SQL 或子查询(请参阅代码中的 PHPDoc 注释以了解可以传递的位置)。
  • 智能表前缀,考虑表别名(在原始表达式中不起作用)。
  • 所有值都进入绑定,即使是子查询中的值。
  • 无依赖项。仅需要 PHP ≥ 7。

支持的 SQL 语法

  • MySQL
  • SQLite
  • SQL Server(不支持完整)
  • 可能任何其他,尚未测试

如果需要语法支持,请扩展 CommonGrammar 类并创建一个拉取请求。

文档

文档可在 queryscribe.readthedocs.io 查找。

此外,代码中的所有类、方法和属性都有 PHPDoc 注释。

版本兼容性

项目遵循 语义版本控制

许可证

MIT。有关详细信息,请参阅 LICENSE 文件。