私はLaravel初心者なので、このフレームワークのベストプラクティスについてはあまり詳しくありません。私は、データベースを作成するための最良の方法を理解しようとしています。移行。
Laravelのドキュメントを含む、ウェブ上で見つけたいくつかの例ここそしてここは、1 つのテーブルのみを処理する移行スクリプトを指しているようです。私は約 10 個のテーブルを持つアプリケーションを作成しています。これらのテーブルはすべて、外部キーで相互に関連付けられており、一部のテーブルは多対多の関係にあります。
テーブルごとに 1 つの移行ファイルを用意するのが推奨されるアプローチですか? そうである場合、その理由は何ですか? (すべてのテーブル作成スクリプトを 1 つのファイルに入れることの欠点はありますか?)
外部キーとリレーションシップはどうでしょうか? これらのリレーションシップと、table1 が table2 の列を参照する場合に table2 が table1 の前に作成されるような移行の実行順序をどのように強制するのでしょうか?
多対多の関係はどうですか? リレーションシップ (ピボット) テーブルも、別の移行スクリプトを使用して手動で作成する必要がありますか? そうである場合、2 つの関連テーブルの後に作成されるようにするにはどうすればよいでしょうか?
ベストアンサー1
アプリケーションの開発中は、移行ごとにテーブルが 1 つしかないことをあまり気にする必要はないと思います。1 回の移行で複数のテーブルをまとめて移行する方が簡単な場合もありますが、システムが本番環境に移行すると、そのように作業を続けることはできなくなります。本番環境でのみ移行し、おそらくロールバックは行われないため、移行は非常に小さくなり、1 つの列を作成するための移行が必要になることもあります。
テーブルを異なるマイグレーションに配置する利点は、クラスが薄い場合と同じです。1 つのファイルに含まれる情報が少ないほど、管理や変更が容易になります。したがって、すべてのテーブルを 1 つのマイグレーションに配置すると、保守が難しくなりますが、それは実際にはあなた次第です。
外部キーは、テーブルごと、さらには外部キーごとに 1 つの移行を作成する必要がある理由の良い例です。外部キーに関連するテーブルをロールバックするたびに、最初にすべての外部依存関係を削除する必要があります。そのため、Laravel は、同じ順序ですべての移行を作成し、テーブルの削除を台無しにしないようにします。したがって、最初にテーブルの移行を作成し、次に外部キーの移行を作成します。そうすれば、ロールバック時に最初に制約がロールバックされ、次にテーブルがロールバックされます。
クロス外部キーが多すぎない限り、テーブルの移行時にそのテーブルの外部キーを作成します。ただし、Schema::table()
一部のデータベースでは制約をアタッチする前に列を用意する必要があるため、常に別のコマンドで外部キーを作成します。
public function up()
{
Schema::create('statuses', function(Blueprint $table)
{
$table->string('id', 64)->primary();
$table->string('user_id', 64)->index();
$table->text('body');
$table->timestamps();
});
Schema::table('statuses', function(Blueprint $table)
{
$table->foreign('user_id')
->references('id')
->on('users')
->onUpdate('cascade')
->onDelete('cascade');
});
}
多対多については、テーブルと外部キーを一緒に作成する場合は、最初にマスター テーブルを作成し、次にピボット テーブルを作成する必要がありますが、外部キーを個別の移行で作成する場合は、最初にテーブルを作成し (順序はあまり重要ではありませんが、その場合も整理しておくことをお勧めします)、次に外部キーの移行を作成します。
開発中はテーブルに多くの変更を加えるため、常にテーブルに戻ることになります。そのため、移行を変更するときは、次のようにします。
1)php artisan migrate:reset
何度も
2) 移行の変更
3)php artisan migrate
新しいものを作成するだけであれば、移行は通常は冪等性を持つため、通常は問題は発生しません。
最後の質問にはすでに回答されていますが、もう一度言います。Laravel はタイムスタンプを使用して移行ファイルに名前を付けます。これにより、別の移行が作成される前に、別の移行が実行されることがなくなります。
2014_07_16_190821_create_statuses_table
移行の名前は重要です。上記の移行により、次のクラスが作成されるからです。
CreateStatusesTable
したがって、必ず行う必要があることの 1 つは、すべての移行を異なる名前で作成することです。そうしないと、同じ名前の 2 つのクラスが作成され、Laravel ではなく PHP がそれについてエラーを出します。