angel-source-labs/laravel-expression-grammar

Laravel 数据库语法助手。根据数据库连接驱动返回适当的 SQL。

v1.0 2023-01-28 19:50 UTC

This package is auto-updated.

Last update: 2024-08-29 00:35:20 UTC


README

根据数据库提供不同语法的表达式助手

有时 SQL 表达式需要为不同的数据库和不同版本的数据库提供不同的语法。

此包提供了一个 ExpressionGrammar 类,该类将生成适用于使用中的数据库和版本的适当表达式。

例如,当 Laravel 的 Excel Seeder 测试异常消息时,它可以基于使用的数据库解决语法

        $this->expectExceptionMessage(ExpressionGrammar::make()
            ->sqLite('Integrity constraint violation: 19 FOREIGN KEY constraint failed')
            ->mySql('Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint')
            ->sqlServer('Cannot truncate table \'users\' because it is being referenced by a FOREIGN KEY constraint.')
        );
        \DB::table('users')->truncate();

另一个例子,当在 MySQL 8.0 与 MySQL 5.7 和 Postgres 之间使用 ST_GeomFromText() 时,纬度和经度的顺序不同,在数据库之间切换时,可能希望您的代码库在不更改的情况下正常工作。MySQL 8.0 为 ST_GeomFromText() 提供了一个选项来更改轴顺序。因此,虽然 Postgres 的语法看起来像 ST_GeomFromText('POINT(1 2)', 4326),而 MySql 8.0 的语法看起来像 ST_GeomFromText('POINT(1 2)', 4326, 'axis-order=long-lat')

使用 ExpressionGrammar 创建一个支持这三种不同语法的 Expression

$expression = ExpressionGrammar::make()
        ->mySql("ST_GeomFromText('POINT(1 2)', 4326)")
        ->mySql("ST_GeomFromText('POINT(1 2)', 4326, 'axis-order=long-lat')", "8.0")
        ->postgres("ST_GeomFromText('POINT(1 2)', 4326)");

这将解析为以下针对指定数据库和版本的表达式

默认情况下,Laravel 表达式不支持绑定。 Laravel 表达式 是一个提供支持绑定的表达式的包,这使得 ExpressionGrammar 助手可以返回由查询构建器评估的具有绑定的表达式。

可用方法

ExpressionGrammar 类提供了一个流畅的接口来添加语法表达式,并为每个内置 Laravel 驱动程序以及允许指定其他数据库的驱动程序字符串的通用 grammar 方法提供了方法。

#ExpressionGrammar::make()

创建一个新的 Grammar 实例,并提供添加语法表达式的流畅接口。

#ExpressionGrammar->mySql($string, $version (optional))

添加 MySQL 语法的表达式。

#ExpressionGrammar->postgres($string, $version (optional))

添加 Postgres 语法的表达式。

#ExpressionGrammar->sqLite($string, $version (optional))

添加 SQLite 语法的表达式。

#ExpressionGrammar->sqlServer($string, $version (optional))

添加 SqlServer 语法的表达式。

#ExpressionGrammar->grammar($driver, $string, $version (optional))

添加其他数据库驱动程序的语法表达式。 $driver 应该匹配 Laravel 查询构建器驱动程序使用的驱动程序字符串。例如 $grammar->postgres("ST_GeomFromText('POINT(1 2)', 4326)") 等同于 $grammar->grammar("pgsql", "ST_GeomFromText('POINT(1 2)', 4326)")

可选的 $version 参数。未指定时,语法应用为默认值。指定时,语法应用于数据库的指定版本或更高版本。

如果查询构建器尝试解析尚未为该数据库驱动程序定义语法的语法的表达式,ExpressionGrammar 将抛出 GrammarNotDefinedForDatabaseException

许可证

Laravel 的 ExpresionGrammar 是开源软件,许可协议为 MIT。