如何让 PhpStorm 理解同一项目中 HEREDOC 中的不同 SQL 方言

How to get PhpStorm to understand different SQL dialects in HEREDOC in the same project

我的 PHP 7.3 应用程序连接到 MS SQL 服务器或 MariaDB,具体取决于 运行 在 Windows 或 Linux 下。

对于我的查询,我有时会在 SQL 服务器语法 中编写查询 ,有时在 MySQL 语法 中编写查询 .对于代码验证等,我使用 PhpStorm's language injection via HEREDOC

当然,只有在项目中配置的方言才能正确验证。

示例:

switch ($dt_type) {
    case 'MSSQL':
        $sql_string = <<<SQL
            [MSSQL query here]
        SQL;
    case 'MYSQL':
    case 'MSSQL':
        $sql_string = <<<SQL
            [MYSQL query here]
        SQL;
}

我在我的项目中配置了 MSSQL 方言,因此 PhpStorm(正确地,预期的)将我的 MySQL 查询标记为无效并使语法高亮显示异常。

有没有办法告诉 PhpStorm,应该使用不同的 SQL 方言验证特定字符串,例如通过在该字符串声明之前的注释中声明它?我尝试了 @lang 注释和语言注入注释.. 没有任何成功。

我知道这可能不可能,但也许有人知道诀窍?

SQL 用于为该文件应用当前 SQL 方言(您可以配置 IDE 以在每个 file/folder 基础上使用不同的方言)。


要在同一文件中包含 2 种方言 ,只需:

  • 如果要在整个项目中更改它,请不要使用 SQL 作为标识符,因为它会注入当前的 SQL 方言。

    我的意思是:可以用,没问题;但如果您稍后更改设置,则不会得到 lost/confused(SQL 那个 folder/file 或整个项目的方言)

  • 创建并使用更具体的标识符,而不是指示 IDE 在那里使用特定的方言。

很简单:只需为捆绑的 SQL 标识符克隆并调整一点语言注入规则:

  1. Settings (Preferences on macOS) | Editor | Language Injections

  2. 克隆 <<<SQL 的现有规则并根据需要进行调整(或使用正确的类型从头开始创建新规则)

正如您从这个例子中看到的,Postgre 的字符串SQL 语法错误(项目没有附加数据库,因此未知 table table):


通过@lang 就地语言注入也可以。注意注入必须放在字符串内容之前,而不是变量等之前

$sql1 = /** @lang MySQL */'SELECT * FROM `table`';
$sql2 = /** @lang PostgreSQL */'SELECT * FROM `table`';