2016-12-20 8 views
1

私は、既存のデータベースを更新して、自動インクリメントされた主キーを使用するように取り組んでいます。このDBには現在、カスタム値を持つPKフィールドがあります。最初にautoincフィールドがあるかどうかを調べるために、まず各テーブルをチェックする必要があります。次に、それをドロップして 'id'フィールドに置き換えます。laravelスキーマビルダー、find columnType autoincrement

私はこれをマイグレーションとして行いたいと思いますが、これまでのところ私はこれまでのことですが、最初の列がすでに自動インクリメントされているかどうかを確認できないため、既存のPKを削除して置き換えます。私は、コントローラから次のコードを実行した問題を解決するために

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

'Schema :: getColumnType($ table、$ column) '? – Abrar

+0

@AbrarShariarGalibはい私はそのトラックにいますが、明らかにlaravelにDoctrine/DBALが必要です。私は列リストを取得する必要があると思う最初の列を確認するautoinc – caro

+0

実際に@AbrarShariarGalibそれは単に '整数'と言って、私はそれがautoincrementing int場合は教えていない – caro

答えて

0

...その後firstColumn getColumnTypeようなものでhasColumnを交換する必要があります。今、あなたは簡単に"Extra" : "auto_increment"を抽出することができ

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": "" 
    } 

:今dd()後の出力は、多少のようになります

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

私はデモのための2つのフィールドのみ( idname)を持っていることをここで注意してくださいこれは次のようになります。

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

」と表示される場所で、 'DB :: raw()'を使用します。これを行うか、「information_schemaからCOLUMN_NAMEを選択」のような情報スキーマから選択します。 COLUMNS' ここで、TABLE_SCHEMA = 'table_schema' とTABLE_NAME = 'table_name' とextra = 'auto_increment' "です。私はLaravelでやりたいと思っていましたが、これで十分です。入力いただきありがとうございます! – caro

関連する問題