データベース: 移行
概要
移行はデータベースのバージョン管理のようなもので、チームが簡単に編集してアプリケーションのデータベース テーブルを共有できるようにします。構造、移行は、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 オプションを追加します。指定されたパスは、アプリケーションのベース パスからの相対パスである必要があります。
移行構造
移行クラスには、通常、
up と
down # の 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')) {
//
}
データベース構造を使用できます。ジェネレーターで次のコマンドを使用して、テーブルのオプションを定義します:
Command | Description |
---|
$table->engine = 'InnoDB'; | テーブル ストレージ エンジン (MySQL) を指定します。 |
$table->charset = 'utf8'; | データ テーブル (MySQL) のデフォルトの文字セットを指定します。 |
$table->collation = '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');
利用可能なフィールド タイプ
データベース構造ジェネレーターには、テーブルの構築時に指定できるさまざまなフィールド タイプが含まれています:
コマンド | 説明 |
---|
#$table->bigIncrements('id ' );
| インクリメント ID (主キー)。「UNSIGNED BIG INTEGER」に相当します。 |
#$table->bigInteger('votes' ) ;
| BIGINT と同等 |
##$table->binary('data'); と同等BLOB | |
$table->boolean('confirmed'); BOOLEAN | | # と同等
##$table->char('name', 100);##長さの CHAR と同等
| ##$table ->date('created_at'); |
DATE と同等
| #$table->dateTime('created_at '); |
DATETIME と同等
| ##$table->dateTimeTz('created_at'); |
DATETIME と時刻と同等zone ##$table->decimal('amount', 8, 2); | | 精度および基数 DECIMAL
# と同等#$table->double('amount', 8, 2); | は、精度および Base DOUBLE |
# と同等です。 #$table->enum('level', ['easy', 'hard']);
| 同等の ENUM |
$table->float('amount', 8, 2);
| は、精度と基数 ## を備えた FLOAT# と同等です。 |
$table->geometry('positions'); | GEOMETRY と同等 |
$table ->geometryCollection('positions'); | GEOMETRYCOLLECTION |
#$table->increments('id'); | ID (主キー) の増加、「UNSIGNED INTEGER」と同等 |
##$table->integer('votes');
| INTEGER と同等 |
##$table->ipAddress('visitor'); IP アドレス | と同等 |
$table->json('options'); は JSON | |
と同等です##$table->jsonb('options'); JSONB と同等 | |
##$table->lineString( 'positions' );LINESTRING と同等 | | ##$table->longText('description');
同等LONGTEXT
| #$table->macAddress('device'); |
MAC アドレスと同等
| $table->mediumIncrements('id'); |
インクリメント ID (主キー)、「UNSIGNED MEDIUM INTEGER」に相当
| $table->mediumInteger('votes'); |
MEDIUMINTと同等
| $ table-> ;mediumText('description'); |
は MEDIUMTEXT と同等です$table->morphs('tagable'); | は、増加する tagable_id と文字列 taggable_type を追加することと同じです。 | ##$table->multiLineString('positions');
| MULTILINESTRING | と同等$table->multiPoint('positions');
| MULTIPOINTと同等 | $table-> multiPolygon('positions');
| MULTIPOLYGON と同等 | ##$table->nullableMorphs('taggable'); nullable バージョンの | morphs() フィールド
| ##$table->nullableTimestamps();# と同等##timestamps() の null 許容バージョンと同等です | ##$table->point('position'); | POINT と同等
| ##$table->polygon('positions'); | POLYGON と同等
| $table->rememberToken(); | NULL 可能バージョンの VARCHAR (100) の remember_token フィールドと同等です。 | $table->smallIncrements('id');
| インクリメント ID (主キー)、「UNSIGNED SMALL INTEGER」と同等 #$table->smallInteger('votes'); | は SMALLINT | ## と同等です#$table->softDeletes();
| 論理的な削除のために null 許容の deleted_at | フィールドを追加するのと同等 # $table->softDeletesTz(); | 論理的な削除のタイムゾーンを含む NULL 可能な deleted_at フィールドを追加するのと同等 | #$table->string('name', 100);
| 長さの VARCHAR と同等 | $table->text('description');
| TEXTと同等 | #$table-> ;time(' sunset'); #TIME と同等 | | ##$table->timeTz('sunrise'); タイムゾーン付きのTIMEと同等 | | #$table->timestamp('added_on'); TIMESTAMP と同等 | $table->timestampTz('added_on'); | は、タイム ゾーン # の TIMESTAMP | # と同等です。 #$table->timestamps(); | NULL 可能な created_at および updated_at TIMESTAMP | ## と同等 $table->timestampsTz();
| ヌル可能でタイムゾーン TIMESTAMP# を持つ created_at および updated_at と同等 | #$table->tinyIncrements('id'); UNSIGNED TINYINT | # を自動的にインクリメントするのと同等##$table->tinyInteger('votes');
| は TINYINT | と同等です $table->unsignedBigInteger('投票');
| Unsigned BIGINTと同等 | ##$table->unsignedDecimal('amount' , 8, 2); は、精度と基数を備えた UNSIGNED DECIMAL | と同等です | $table->unsignedInteger('votes'); | Unsigned INTと同等 | $ table->unsignedMediumInteger('votes'); | Unsigned MEDIUMINT | #$table->unsignedSmallInteger('votes') ; と同等。 | Unsigned SMALLINT と同等 | ##$table->unsignedTinyInteger('votes');
| と同等Unsigned TINYINT | ##$table->uuid('id'); UUID | | # と同等 ##$table->year('birth_year');YEAR と同等 | |
フィールドの変更上記のフィールド タイプに加えて、データベース テーブルにフィールドを追加するときに使用できる「修飾子」がいくつかあります。たとえば、フィールドを "nullable" にしたい場合は、nullable メソッドを使用できます。 Schema::table('users', function (Blueprint $table) {
$table->string('email');
}); 以下は、使用可能なすべてのフィールド修飾子のリストです。このリストには インデックス修飾子 : は含まれません。#修飾子 | 説明 |
---|
##->after('column')
| このフィールドを他のフィールドの「後」に配置します (MySQL) | ->autoIncrement() #Set自動インクリメント主キーとしての INTEGER 型のフィールド | | ->charset('utf8') 文字セットを指定します ( MySQL) | | ->collation('utf8_unicode_ci') 列の照合順序を指定します (MySQL/SQL Server) | | ->comment('my comment') フィールドにコメントを追加する (MySQL) | | ->default($value) フィールドの「デフォルト」値を指定します | | ->first() このフィールドをデータ テーブルの「最初の位置」に配置します (MySQL) | | ->nullable($value = true) このフィールドでは、NULL 値を書き込むことができます (デフォルト) | | #->storedAs($expression)ストレージ生成フィールドの作成 (MySQL) | | ##->unsigned() INTEGER 型フィールドを UNSIGNED に設定します(MySQL)
| | ->useCurrent() CURRENT_TIMESTAMP をデフォルト値として使用するように TIMESTAMP 型のフィールドを設定します
| | ->virtualAs($expression) 仮想生成フィールドの作成 (MySQL)
|
フィールドの変更前提条件フィールドを変更する前に、必ず追加してください。 doctrine/dbal の composer.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/dbal が composer.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->dropRememberToken();
| remember_token フィールドを削除します。 | $table->dropSoftDeletes();
| deleted_at フィールドを削除します。 | $table->dropSoftDeletesTz();
| dropSoftDeletes() メソッドのエイリアス。 | ##$table->dropTimestamps();
| created_at フィールドと updated_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->primary ( 'id');主キーの追加
| | $table->primary(['id', 'parent_id']); 複合キーの追加
| ##$table->unique('email'); | 一意のインデックスの追加
| #$table->index('state'); | 通常のインデックスを追加します #$table->spatialIndex('location'); | | 空間インデックスの追加 (SQLite はサポートされていません) インデックスの長さと Mysql / MariaDBLaravel はデフォルトで utf8mb4 エンコーディングを使用し、データベースへの emojis の保存をサポートします。 MySQL バージョン 5.7.7 より前のバージョン、または MariaDB バージョン 10.2.2 より前のバージョンでインデックスを作成している場合は、データベース移行のデフォルトの文字列長を手動で構成する必要があります。 つまり、AppServiceProvider の Schema::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
| #$table->dropSpatialIndex からベース インデックスを削除します( 'geo_location_spatialindex');
| geo テーブルから空間インデックスを削除します (SQLite はサポートされていません)
| フィールド配列が 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) で [外部キーのサポートを有効にする] を必ず有効にしてください。
|
|
|