データベースの移行


データベース: 移行

概要移行はデータベースのバージョン管理のようなもので、チームが簡単に編集してアプリケーションのデータベース テーブルを共有できるようにします。構造、移行は、Laravel のデータベース構造ジェネレーターと組み合わせて使用​​されることが多く、データベース構造を簡単に構築できます。データベース構造に手動でフィールドを追加するよう同僚に依頼しなければならなかった場合、データベースの移行により、その手間を省くことができます。

Laravel の Schema

ファサードは、Laravel でサポートされるすべてのデータベース システムのデータ テーブルの作成と操作に対応するサポートを提供します。

移行の生成

アーティザン コマンド make:migration を使用して移行を作成します。

php artisan make:migration create_users_table

新しい移行は、database/migrations ディレクトリにあります。各移行ファイル名には、Laravel が移行の順序を確認できるようにするタイムスタンプが含まれています。

--table および --create オプションを使用して、データ テーブルの名前を指定したり、新しいデータ テーブルを作成するかどうかを指定したりできます。マイグレーションが実行されます。移行ファイルを事前生成するときに、これらのオプションを指定されたデータ テーブルに入力する必要があります:

php artisan make:migration create_users_table --create=users

php artisan make:migration add_votes_to_users_table --table=users

移行を生成するためのカスタム出力パスを指定する場合は、make:migration# を実行できます。 ## コマンド実行時に --path オプションを追加します。指定されたパスは、アプリケーションのベース パスからの相対パスである必要があります。

移行構造

移行クラスには、通常、

updown # の 2 つのメソッドが含まれています。 ##。 up メソッドは、新しいデータ テーブル、フィールド、またはインデックスをデータベースに追加するために使用され、down メソッドは up メソッドの逆の操作です。および up の操作が逆になります。 これら 2 つのメソッドでは、Laravel の

Schema

ビルダーを使用してテーブルを作成および変更します。 Schema
ジェネレーターを理解するには 使用可能なすべてのメソッドについては、そのドキュメントを参照できます。たとえば、flights テーブルを作成する簡単な例:

<?php
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    class CreateFlightsTable extends Migration{  
      /**
     * 运行数据库迁移
     *
     * @return void
     */    
     public function up()   
      {       
       Schema::create('flights', function (Blueprint $table) {  
                 $table->increments('id');            
                 $table->string('name');            
                 $table->string('airline');            
                 $table->timestamps();        
             });   
          }   
     /**
     * 回滚数据库迁移
     *
     * @return void
     */   
    public function down()   
     {       
      Schema::drop('flights');   
      }
 }

移行の実行

アーティザン コマンド

merge

を実行して、未処理の移行をすべて実行します:

php artisan migrate

{注} Homestead 仮想マシンを使用している場合は、仮想マシンでこのコマンドを実行する必要があります。

運用環境での強制的な移行

一部の移行操作は破壊的であり、データ損失が発生する可能性があります。実稼働環境で誰かがこれらのコマンドを実行するのを防ぐために、システムはこれらのコマンドが実行される前に確認を行います。システム プロンプトに関係なくコマンドを強制的に実行したい場合は、

--force

タグを使用できます:

php artisan migrate --force

リターン ローリング移行

最後の移行をロールバックするには、

rollback

コマンドを使用できます。このコマンドは、最後の「移行」操作をロールバックします。この操作には、複数の移行ファイルが含まれている場合があります。

php artisan migrate:rollback

rollback

コマンドの後に step パラメータを追加すると、ロールバック移行の数を制限します。たとえば、次のコマンドは、最後の 5 つの移行をロールバックします:

php artisan migrate:rollback --step=5

maigrate:reset

このコマンドは、アプリケーション内のすべての移行をロールバックできます:

php artisan migrate:reset

単一のコマンドを使用してロールバックまたは移行を実行します。

maigrate:refresh このコマンドは、データベースのすべての移行をロールバックするだけでなく、移行# ## 指示。このコマンドを使用すると、データベース全体を効率的に再構築できます。

php artisan migrate:refresh
// 刷新数据库结构并执行数据填充
php artisan migrate:refresh --seed

refresh コマンドを使用し、step パラメータを指定して、最後に指定した数の移行をロールバックして実行します。たとえば、次のコマンドは、最後の 5 つの移行をロールバックして再実行します。 ## コマンド すべてのテーブルがデータベースから削除され、その後 mite

コマンドが実行されます:
php artisan migrate:refresh --step=5

#data table

データ テーブルの作成

次の

create

メソッドを使用して作成できます。 Schema ファサード 新しいデータベース テーブル。

create
メソッドは 2 つのパラメータを受け入れます: 最初のパラメータはデータ テーブルの名前で、2 番目のパラメータは
Closure

です。このクロージャは、新しいデータ テーブルを定義するために使用される # を受け取ります. ##Blueprint

オブジェクト:

php artisan migrate:fresh

php artisan migrate:fresh --seed
もちろん、データ テーブルを作成するときは、任意のデータベース構造ジェネレーターの field メソッド を使用して、データ テーブルのフィールドを定義できます。 。 データ テーブル/フィールドが存在するかどうかを確認しますhasTable

メソッドと

hasColumn メソッドを使用して、データ テーブル/フィールドが存在するかどうかを確認できます。データテーブルまたはフィールドが存在します 存在:

Schema::create('users', function (Blueprint $table) 
{   
 $table->increments('id');
});

データベース接続とテーブル オプション

デフォルトの接続ではないデータベース接続で構造的な操作を実行する場合は、connection メソッドを使用できます:

if (Schema::hasTable('users')) { 
   //
   }
if (Schema::hasColumn('users', 'email')) { 
      //
    }

データベース構造を使用できます。ジェネレーターで次のコマンドを使用して、テーブルのオプションを定義します:

CommandDescription
$table->engine = 'InnoDB';テーブル ストレージ エンジン (MySQL) を指定します。
$table->charset = 'utf8';データ テーブル (MySQL) のデフォルトの文字セットを指定します。
$table->collat​​ion = 'utf8_unicode_ci';データ テーブル (MySQL) のデフォルトの照合順序を指定します。
$table->temporary();一時テーブルを作成します (SQL Server はサポートされていません)。

データ テーブルの名前変更/削除

データ テーブルの名前を変更するには、rename メソッドを使用できます。 :

Schema::connection('foo')->create('users', function (Blueprint $table) { 
   $table->increments('id');
  });

既存のデータ テーブルを削除するには、drop または dropIfExists メソッドを使用できます:

Schema::rename($from, $to);

rename Data外部キーを持つテーブル

テーブルの名前を変更する前に、Laravel に規則に従って名前を設定させるのではなく、テーブルの外部キー制約が移行ファイル内で明示的に名前を持っていることを確認する必要があります。それ以外の場合、外部キーの制約名は古いテーブル名を参照します。

#フィールド

フィールドの作成フィールド

Schema ファサードの table メソッドを使用して、既存のデータ テーブルを更新します。 create メソッドと同様、table メソッドは 2 つのパラメーターを受け入れます。1 つはデータ テーブルの名前で、もう 1 つはフィールドを追加するために使用できる Blueprint です。テーブル。 インスタンスの終了:

Schema::drop('users');Schema::dropIfExists('users');

利用可能なフィールド タイプ

データベース構造ジェネレーターには、テーブルの構築時に指定できるさまざまなフィールド タイプが含まれています:

インクリメント ID (主キー)。「UNSIGNED BIG INTEGER」に相当します。BIGINT と同等##$table->binary('data');$table->boolean('confirmed');# と同等##$table->char('name', 100);DATE と同等DATETIME と同等##$table->dateTimeTz('created_at');DATETIME と時刻と同等zone精度および基数 DECIMAL# と同等# と同等です。 同等の ENUM は、精度と基数 INTEGER と同等##$table->ipAddress('visitor'); と同等$table->json('options'); と同等です##$table->jsonb('options');##$table->lineString( 'positions' );##$table->longText('description');MAC アドレスと同等 インクリメント ID (主キー)、「UNSIGNED MEDIUM INTEGER」に相当 MEDIUMINTと同等 は MEDIUMTEXTMULTILINESTRING と同等MULTIPOINTと同等MULTIPOLYGON と同等##$table->nullableMorphs('taggable');morphs()##$table->nullableTimestamps();POINT と同等##$table->polygon('positions');POLYGON と同等$table->rememberToken();NULL 可能バージョンの VARCHAR (100) の インクリメント ID (主キー)、「UNSIGNED SMALL INTEGER」と同等論理的な削除のために null 許容の フィールドを追加するのと同等 # 長さの VARCHAR と同等TEXTと同等##$table->timeTz('sunrise');#$table->timestamp('added_on'); は、タイム ゾーン # と同等です。 #$table->timestamps(); NULL 可能な created_atヌル可能でタイムゾーン TIMESTAMP# を持つ は TINYINTUnsigned BIGINTと同等##$table->unsignedDecimal('amount' , 8, 2); と同等Unsigned TINYINT##$table->uuid('id');# と同等##$table->year('birth_year');

フィールドの変更

上記のフィールド タイプに加えて、データベース テーブルにフィールドを追加するときに使用できる「修飾子」がいくつかあります。たとえば、フィールドを "nullable" にしたい場合は、nullable メソッドを使用できます。

Schema::table('users', function (Blueprint $table) { 
   $table->string('email');
  });

以下は、使用可能なすべてのフィールド修飾子のリストです。このリストには インデックス修飾子 :

は含まれません。
コマンド説明
#$table->bigIncrements('id ' );
#$table->bigInteger('votes' ) ;
と同等BLOB
BOOLEAN
##長さの CHAR と同等 ##$table ->date('created_at');
#$table->dateTime('created_at ');
##$table->decimal('amount', 8, 2);
#$table->double('amount', 8, 2); は、精度および Base DOUBLE
#$table->enum('level', ['easy', 'hard']);
$table->float('amount', 8, 2);## を備えた FLOAT# と同等です。
$table->geometry('positions');GEOMETRY と同等
$table ->geometryCollection('positions');GEOMETRYCOLLECTION
#$table->increments('id'); ID (主キー) の増加、「UNSIGNED INTEGER」と同等
##$table->integer('votes');
IP アドレス
は JSON
JSONB と同等
LINESTRING と同等
同等LONGTEXT#$table->macAddress('device');
$table->mediumIncrements('id');
$table->mediumInteger('votes');
$ table-> ;mediumText('description');
と同等です
$table->morphs('tagable'); は、増加する tagable_id と文字列 taggable_type を追加することと同じです。
##$table->multiLineString('positions');
$table->multiPoint('positions');
$table-> multiPolygon('positions');
nullable バージョンの フィールド
# と同等##timestamps() の null 許容バージョンと同等です##$table->point('position');
remember_token フィールドと同等です。 $table->smallIncrements('id');
#$table->smallInteger('votes'); は SMALLINT
## と同等です#$table->softDeletes();deleted_at
$table->softDeletesTz();論理的な削除のタイムゾーンを含む NULL 可能な deleted_at フィールドを追加するのと同等
#$table->string('name', 100);
$table->text('description');
#$table-> ;time(' sunset');#TIME と同等
タイムゾーン付きのTIMEと同等
TIMESTAMPと同等$table->timestampTz('added_on');
# の TIMESTAMP
および updated_at TIMESTAMP ## と同等$table->timestampsTz();
created_at および updated_at と同等#$table->tinyIncrements('id'); UNSIGNED TINYINT
# を自動的にインクリメントするのと同等##$table->tinyInteger('votes');
と同等です $table->unsignedBigInteger('投票');
は、精度と基数を備えた UNSIGNED DECIMAL と同等です
$table->unsignedInteger('votes');Unsigned INTと同等
$ table->unsignedMediumInteger('votes');Unsigned MEDIUMINT
#$table->unsignedSmallInteger('votes') ; と同等。 Unsigned SMALLINT と同等
##$table->unsignedTinyInteger('votes');
UUID
YEAR と同等
このフィールドを他のフィールドの「後」に配置します (MySQL)->charset('utf8')->collat​​ion('utf8_unicode_ci')->comment('my comment')->default($value)->first() ->nullable($value = true) #->storedAs($expression)##->unsigned()->useCurrent()->virtualAs($expression)
#修飾子説明
##->after('column')
->autoIncrement()#Set自動インクリメント主キーとしての INTEGER 型のフィールド
文字セットを指定します ( MySQL)
列の照合順序を指定します (MySQL/SQL Server)
フィールドにコメントを追加する (MySQL)
フィールドの「デフォルト」値を指定します
このフィールドをデータ テーブルの「最初の位置」に配置します (MySQL)
このフィールドでは、NULL 値を書き込むことができます (デフォルト)
ストレージ生成フィールドの作成 (MySQL)
INTEGER 型フィールドを UNSIGNED に設定します(MySQL)
CURRENT_TIMESTAMP をデフォルト値として使用するように TIMESTAMP 型のフィールドを設定します
仮想生成フィールドの作成 (MySQL)

フィールドの変更

前提条件

フィールドを変更する前に、必ず追加してください。 doctrine/dbalcomposer.json ファイルへの依存関係。 Doctrine DBAL ライブラリは、フィールドの現在の状態を判断し、フィールドに指定された調整を行うために必要な SQL クエリを作成するために使用されます:

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
 });

Update Field Properties

change メソッドは、既存のフィールド タイプを新しいタイプに変更したり、属性を変更したりできます。
たとえば、増やしたい場合があります。文字列フィールドの長さについては、change メソッドを使用して、name フィールドの長さを 25 から 50 に増やすことができます。 Null 可能にするフィールド:

composer require doctrine/dbal

{注} 次のフィールド タイプのみを「変更」できます: bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText 、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger、および unsignedSmallInteger。

フィールド名の変更

フィールドの名前は、構造ビルダーの

renameColumn

メソッドを使用して変更できます。フィールドの名前を変更する前に、doctrine/dbalcomposer.json ファイルに追加されていることを確認してください。依存関係:

 Schema::table('users', function (Blueprint $table) { 
    $table->string('name', 50)->change(); 
  });

{Note} 現在は追加されていませんenum型のフィールド名の変更をサポートしました。

フィールドを削除するには、
dropColumn

メソッドを使用できます。構造ビルダーを使用してフィールドを削除します。 SQLite データベースからフィールドを削除する前に、

doctrine/dbal

依存関係を composer.json ファイルに追加し、ターミナルで composer update を実行してインストールする必要があります。依存関係:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
  });
フィールドの配列を dropColumn メソッドに渡して複数のフィールドを削除できます:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
 });

{注} SQLite データベースを使用する場合は、複数のフィールドを削除します。移行中に複数のフィールドを削除または変更します。

使用可能なコマンドエイリアス

##$table->dropTimestamps();created_at$table->dropTimestampsTz();dropTimestamps()

#インデックス

##インデックスを作成

構造ジェネレーターは、複数のタイプのインデックスをサポートします。まず、フィールド値が一意であることを指定します。つまり、フィールド定義の後にチェーン内の

unique

メソッドを呼び出してインデックスを作成します。たとえば、

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
 });
または、次のようにすることもできます。フィールドを定義した後にも作成します。例:

Schema::table('users', function (Blueprint $table) {  
  $table->dropColumn(['votes', 'avatar', 'location']);
});

配列をインデックス メソッドに渡して複合 (または合成) インデックスを作成することもできます:

$table->string('email')->unique();

Laravel は適切なインデックス名を自動的に生成しますが、次のこともできます。 pass インデックス名をカスタマイズするための 2 番目のパラメータ:

$table->unique('email');

利用可能なインデックス タイプ

各インデックス メソッドは、インデックス名を指定するためのオプションの 2 番目のパラメータを受け入れます。省略した場合、名前はテーブル名と列名に基づいて生成されます。

コマンド説明
$table->dropRememberToken();remember_token フィールドを削除します。
$table->dropSoftDeletes();deleted_at フィールドを削除します。
$table->dropSoftDeletesTz();dropSoftDeletes() メソッドのエイリアス。
フィールドと updated_at フィールドを削除します。
メソッドのエイリアス。
#コマンド説明##$table->primary ( 'id');$table->primary(['id', 'parent_id']); 一意のインデックスの追加#$table->index('state');通常のインデックスを追加します空間インデックスの追加 (SQLite はサポートされていません)
主キーの追加
複合キーの追加##$table->unique('email');
#$table->spatialIndex('location');

インデックスの長さと Mysql / MariaDB

Laravel はデフォルトで utf8mb4 エンコーディングを使用し、データベースへの emojis の保存をサポートします。 MySQL バージョン 5.7.7 より前のバージョン、または MariaDB バージョン 10.2.2 より前のバージョンでインデックスを作成している場合は、データベース移行のデフォルトの文字列長を手動で構成する必要があります。
つまり、AppServiceProviderSchema::defaultStringLength メソッドを呼び出して構成します。

$table->index(['account_id', 'created_at']);

もちろん、データベースの # を有効にすることも選択できます。 ##innodb_large_prefix オプション。正しく有効にする方法については、データベースのドキュメントをご自身で参照してください。

インデックス名の変更

インデックスの名前を変更するには、

renameIndex メソッドを呼び出す必要があります。 。このメソッドは、現在のインデックス名を最初の引数として、目的の名前を 2 番目の引数として受け入れます。 現在のインデックス名を最初の引数として、新しいインデックス名を 2 番目の引数として渡す必要があります。 パラメータ:

$table->unique('email', 'unique_email');

#インデックスの削除

インデックスを削除するには、インデックスの名前を指定する必要があります。デフォルトでは、Laravel はデータベース名、インデックスフィールド名、インデックスタイプを自動的に単純に名前として連結します。例:

コマンド$table- >dropPrimary('users_id_primary');users$table- >dropUnique('users_email_unique');users$table- >dropIndex ('geo_state_index');geo#$table->dropSpatialIndex からベース インデックスを削除します( 'geo_location_spatialindex');geo

フィールド配列が dropIndex メソッドに渡されると、テーブル名、フィールド、キーの種類に基づいて生成されたインデックス名が削除されます。

use Illuminate\Support\Facades\Schema;
/**
 * 引导任何应用程序服务
 *
 * @return void
 */ 
public function boot() {  
   Schema::defaultStringLength(191);
  }

外部キー制約

Laravel は、データベース層で参照整合性を強制するための制約の作成もサポートしています。外部キー制約。たとえば、users テーブルの id フィールドを参照する user_id フィールドを posts テーブルに定義してみましょう:

$table->renameIndex('from', 'to')

on delete および on update 属性に必要なアクションを指定することもできます。

Schema::table('geo', function (Blueprint $table) {
    $table->dropIndex(['state']); 
    // 删除 'geo_state_index' 索引
   });

dropForeign メソッドを使用できます。外部キーを削除します。外部キー制約には、インデックスと同じ方法で名前が付けられます。つまり、データ テーブル名と制約フィールドを接続し、_foreign サフィックスを追加します:

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedInteger('user_id');    
    $table->foreign('user_id')->references('id')->on('users');
 });

または、フィールド配列を渡すこともでき、削除時にフィールドは次のようになります。契約に従って削除されました 対応する外部キー名に変換します:

$table->foreign('user_id')       
   ->references('id')->on('users')                    
   ->onDelete('cascade');

移行ファイルで次のメソッドを使用して、外部キー制約をオンまたはオフにできます:

$table->dropForeign('posts_user_id_foreign');

{注} SQLite はデフォルトの制約で外部キーを無効にします。 SQLite を使用する場合は、移行で作成する前に、データベース設定 (/docs/laravel/5.8/database#configuration) で [外部キーのサポートを有効にする] を必ず有効にしてください。

この記事は、LearnKu.com Web サイトで初めて公開されました。
説明
テーブルから主キーを削除します
テーブルから一意のインデックスを削除します
table
テーブルから空間インデックスを削除します (SQLite はサポートされていません)