Postgres 和 Laravel 如何将列从类型字符串更改为整数?

Con*_*ech 4 php postgresql laravel eloquent laravel-migrations

我正在尝试将 Postgres 和 Laravel 6.x 上的列从类型字符串更改为整数。我试图通过这样的迁移来做到这一点:

    public function up()
    {
        Schema::table('job_listings', function (Blueprint $table) {
            $table->integer('company_id')->change();
        });
    }
Run Code Online (Sandbox Code Playgroud)

当我运行此迁移时,我收到一个错误,该列无法自动转换为整数:

In Connection.php line 664:

  SQLSTATE[42804]: Datatype mismatch: 7 ERROR:  column "company_id" cannot be cast automatically to type integer
  HINT:  You might need to specify "USING company_id::integer". (SQL: ALTER TABLE job_listings ALTER company_id TYPE INT)


In PDOStatement.php line 123:

  SQLSTATE[42804]: Datatype mismatch: 7 ERROR:  column "company_id" cannot be cast automatically to type integer
  HINT:  You might need to specify "USING company_id::integer".


In PDOStatement.php line 121:

  SQLSTATE[42804]: Datatype mismatch: 7 ERROR:  column "company_id" cannot be cast automatically to type integer
  HINT:  You might need to specify "USING company_id::integer".
Run Code Online (Sandbox Code Playgroud)

在 PostgreSQL 中,我们如何指定 USING 将该列从类型字符串更改为整数?

小智 9

您必须指定显式转换,因为没有从文本或 varchar 到整数的隐式(自动)转换。我不知道 Laravel 函数来指定强制转换,所以我建议您使用原始 DB 语句来实现这一点。

你可以这样做:

public function up()
{
    DB::statement('ALTER TABLE job_listings ALTER COLUMN 
                  company_id TYPE integer USING (company_id::integer');
}
Run Code Online (Sandbox Code Playgroud)

也可能存在文本或 varchar 字段中存在空格的情况,因此您必须在转换之前进行修剪

public function up()
{
    DB::statement('ALTER TABLE job_listings ALTER COLUMN 
                  company_id TYPE integer USING (trim(company_id)::integer');
}
Run Code Online (Sandbox Code Playgroud)

  • SQL 字符串末尾都缺少右括号 - SQL 中的括号当前不匹配。 (2认同)