【问题标题】:laravel schema builder, find columnType autoincrementlaravel 模式生成器,找到 columnType 自动增量
【发布时间】:2017-05-05 19:54:21
【问题描述】:

我正在努力更新现有数据库以使用自动递增的主键。该数据库当前具有带有自定义值的疯狂命名的 PK 字段。我需要先检查每个表,看看它是否有一个 autoinc 字段,然后我想删除它并替换为“id”字段。

我想将其作为迁移来执行,这是我目前所拥有的,但我似乎无法确定第一个 col 是否已经自动递增,因此我可以删除现有的 PK 并替换。我需要将 hasColumn 替换为 firstColumn 然后 getColumnType...

    foreach ($tableNames as $name)
                if (!Schema::hasColumn($name, 'id')) {
                Schema::table($name, function ($table) {
                    $table->dropPrimary();
                    $table->increments('id')->first();
                });
            }
        }

【问题讨论】:

  • 你试过Schema::getColumnType($table,$column)吗?
  • @AbrarSariarGalib 是的,我现在就在这条轨道上,显然 laravel 需要包含 Doctrine/DBAL。我想我需要获取一个列列表,然后将第一个列提供给它以检查它是否是 autoinc
  • 实际上@AbrarShariarGalib 它只是说“整数”,并没有告诉我它是否是一个自动递增的整数
  • 现在我可以考虑使用DB::raw(),其中 sql 查询将具有类似 - EXTRA like '%auto_increment%'

标签: laravel laravel-5 migration laravel-schema-builder


【解决方案1】:

为了解决问题,我从控制器运行了以下代码。注意这里我只有两个用于演示的字段(id,name

$result = DB::select("SHOW COLUMNS FROM table_name"); dd($result);

现在dd() 之后的输出会是这样的:

0 => {#162 ▼
    +"Field": "id"
    +"Type": "int(11)"
    +"Null": "NO"
    +"Key": "PRI"
    +"Default": null
    +"Extra": "auto_increment"
  }

1 => {#164 ▼
    +"Field": "name"
    +"Type": "varchar(255)"
    +"Null": "YES"
    +"Key": ""
    +"Default": null
    +"Extra": ""
  }

现在您可以轻松提取 "Extra" : "auto_increment" ,如下所示:

$result = DB::select("SHOW COLUMNS FROM product");
foreach ($result as $key => $value) {
            if($value->Extra == 'auto_increment'){
                //do something
            };

【讨论】:

  • 我要么这样做,要么从信息模式中选择,例如“从 information_schema 中选择 COLUMN_NAME。COLUMNS where TABLE_SCHEMA = 'table_schema' and TABLE_NAME = 'table_name' and extra = 'auto_increment'” .我曾希望我能用 Laravel 做到这一点,但这已经足够好了。感谢您的意见!
猜你喜欢
  • 2020-03-04
  • 2018-09-05
  • 2011-10-10
  • 2022-01-09
  • 2017-11-08
  • 1970-01-01
  • 2018-04-11
  • 2017-06-15
  • 2019-07-26
相关资源
最近更新 更多