ホームページ >バックエンド開発 >PHPチュートリアル >[ Laravel 5.2 ドキュメント ] データベース -- 移行
移行はデータベースのバージョン管理に似ており、通常、移行はチームが簡単かつ簡単にアプリケーションのデータベース テーブル構造を編集して共有できます。 Laravel と構造ビルダーはペアになっており、アプリケーションのデータベース テーブル構造を簡単に構築できます。
Laravel のスキーマ ファサードは、データベース システムに依存しないテーブルの作成と操作のサポートを提供し、Laravel でサポートされるすべてのデータベース システムに一貫性のあるエレガントでスムーズな API を提供します。
アーティザン コマンド make:migration を使用して、新しい移行を作成します。
php artisan make:migration create_users_table
新しい移行は次の場所にあります。 database/ 移行ディレクトリでは、各移行ファイル名には、Laravel が順序を決定できるようにするタイムスタンプが含まれています。
--table および --create オプションを使用して、テーブル名と、移行で新しいデータ テーブルを作成するかどうかを指定できます。これらのオプションは、上記の移行コマンドの後に単に配置され、テーブル名を指定します:
php artisan make:migration add_votes_to_users_table --table=usersphp artisan make:migration create_users_table --create=users
移行を生成するためのカスタム出力パスを指定したい場合は、make:migration の実行時に --path を使用できます。コマンドのオプションでは、指定するパスはアプリケーションのルートからの相対パスである必要があります。
移行クラスには、up と down の 2 つのメソッドが含まれています。 up メソッドは、テーブル、列、またはインデックスをデータベースに追加するために使用されます。down メソッドは、up メソッドの逆の操作であり、up の操作の逆です。
どちらの方法でも、Laravel のテーブル構造ビルダーを使用してテーブルを作成および変更します。たとえば、フライト テーブルを作成する簡単な例を見てみましょう。
<?phpuse 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'); }}
アプリケーション内のすべての未実行のマイグレーションを実行するには、Artisan コマンドの merge メソッドを使用できます。 Homestead 仮想マシンを使用している場合は、仮想マシンで次のコマンドを実行する必要があります:
php artisan migrate
再実行時に「クラスが見つかりません」というエラー メッセージが表示された場合は、composer dump-autoload を実行してみてください。コマンドを実行してから、移行コマンドを再実行します。
一部の移行操作は破壊的であり、本番データベースでこれらのコマンドを実行しないようにするには、確認を求めるプロンプトが表示されます。これらのコマンドを実行する前に。プロンプトを表示せずにこれらのコマンドを強制的に実行するには、--force を使用します。
php artisan migrate --force
最新の移行操作をロールバックするには、rollback コマンドを使用します。これにより、実行される移行の最後のバッチ。これには複数の移行ファイルが含まれる場合があります:
php artisan migrate:rollback
mitigrate:reset コマンドはすべてのアプリケーション移行をロールバックします:
php artisan migrate:reset
merge:refresh コマンドは、最初にすべてのデータベース移行をロールバックし、その後 mitigate コマンドを実行します。このコマンドは、データベース全体を効果的に再構築できます。
php artisan migrate:refreshphp artisan migrate:refresh --seed
スキーマ ファサードで create メソッドを使用して、新しいデータ テーブルを作成します。 。 create メソッドは 2 つのパラメータを受け取ります。1 つ目はテーブル名で、2 つ目は新しいテーブルの定義に使用される Blueprint オブジェクトのクロージャを取得するためのものです。
Schema::create('users', function ($table) { $table->increments('id');});
もちろん、新しいテーブルを作成するときでは、テーブル構造ビルダーの任意の列メソッドを使用して、データ テーブルの列を定義できます。
hasTable メソッドと hasColumn メソッドを使用して、テーブルまたは列が存在するかどうかを簡単に確認できます:
if (Schema::hasTable('users')) { //}if (Schema::hasColumn('users', 'email')) { //}
デフォルトのデータベース接続ではないデータベース接続でテーブル構造の操作を実行する場合は、次の接続メソッドを使用します:
Schema::connection('foo')->create('users', function ($table) { $table->increments('id');});
テーブルのストレージ エンジンを設定するには、テーブル構造のビルドでサーバー上でエンジン属性を設定します:
Schema::create('users', function ($table) { $table->engine = 'InnoDB'; $table->increments('id');});
既存のデータテーブルの名前を変更するには、名前変更メソッドを使用します:
Schema::rename($from, $to);
To To既存のデータ テーブルを削除するには、drop または dropIfExists メソッドを使用できます。
Schema::drop('users');Schema::dropIfExists('users');
既存のテーブルを更新するには、スキーマ ファサードで table メソッドを使用し、 table メソッドは、テーブル名と、テーブルに列を追加するために使用されるブループリント インスタンスを取得するクロージャの 2 つのパラメータを受け取ります。
Schema::table('users', function ($table) { $table->string('email');});
Ofもちろん、テーブル構造が構築されます。テーブルの構築に使用できる一連の列タイプが含まれます:
命令 | 描述 |
---|---|
$table->bigIncrements('id'); | 自增ID,类型为bigint |
$table->bigInteger('votes'); | 等同于数据库中的BIGINT类型 |
$table->binary('data'); | 等同于数据库中的BLOB类型 |
$table->boolean('confirmed'); | 等同于数据库中的BOOLEAN类型 |
$table->char('name', 4); | 等同于数据库中的CHAR类型 |
$table->date('created_at'); | 等同于数据库中的DATE类型 |
$table->dateTime('created_at'); | 等同于数据库中的DATETIME类型 |
$table->decimal('amount', 5, 2); | 等同于数据库中的DECIMAL类型,带一个精度和范围 |
$table->double('column', 15, 8); | 等同于数据库中的DOUBLE类型,带精度, 总共15位数字,小数点后8位. |
$table->enum('choices', ['foo', 'bar']); | 等同于数据库中的 ENUM类型 |
$table->float('amount'); | 等同于数据库中的 FLOAT 类型 |
$table->increments('id'); | 数据库主键自增ID |
$table->integer('votes'); | 等同于数据库中的 INTEGER 类型 |
$table->json('options'); | 等同于数据库中的 JSON 类型 |
$table->jsonb('options'); | 等同于数据库中的 JSONB 类型 |
$table->longText('description'); | 等同于数据库中的 LONGTEXT 类型 |
$table->mediumInteger('numbers'); | 等同于数据库中的 MEDIUMINT类型 |
$table->mediumText('description'); | 等同于数据库中的 MEDIUMTEXT类型 |
$table->morphs('taggable'); | 添加一个 INTEGER类型的 taggable_id列和一个 STRING类型的 taggable_type列 |
$table->nullableTimestamps(); | 和 timestamps()一样但不允许 NULL值. |
$table->rememberToken(); | 添加一个 remember_token列: VARCHAR(100) NULL. |
$table->smallInteger('votes'); | 等同于数据库中的 SMALLINT 类型 |
$table->softDeletes(); | 新增一个 deleted_at列 用于软删除. |
$table->string('email'); | 等同于数据库中的 VARCHAR 列 . |
$table->string('name', 100); | 等同于数据库中的 VARCHAR,带一个长度 |
$table->text('description'); | 等同于数据库中的 TEXT 类型 |
$table->time('sunrise'); | 等同于数据库中的 TIME类型 |
$table->tinyInteger('numbers'); | 等同于数据库中的 TINYINT 类型 |
$table->timestamp('added_on'); | 等同于数据库中的 TIMESTAMP 类型 |
$table->timestamps(); | 添加 created_at和 updated_at列. |
$table->uuid('id'); | 等同于数据库的UUID |
除了上面列出的列类型之外,在添加列的时候还可以使用一些其它列“修改器”,例如,要使列默认为 null,可以使用 nullable方法:
Schema::table('users', function ($table) { $table->string('email')->nullable();});
下面是所有可用的列修改器列表,该列表不包含索引修改器:
修改器 | 描述 |
---|---|
->first() | 将该列置为表中第一个列 (仅适用于MySQL) |
->after('column') | 将该列置于另一个列之后 (仅适用于MySQL) |
->nullable() | 允许该列的值为NULL |
->default($value) | 指定列的默认值 |
->unsigned() | 设置 integer列为 UNSIGNED |
在修改列之前,确保已经将 doctrine/dbal依赖添加到 composer.json文件,Doctrine DBAL 库用于判断列的当前状态并在需要时创建SQL查询来对列进行指定的调整。
change方法允许你修改已存在的列为新的类型,或者修改列的属性。例如,你可能想要增加 string 类型列的尺寸,让我们将 name列的尺寸从 25 增加到 50:
Schema::table('users', function ($table) { $table->string('name', 50)->change();});
我们还可以修改该列允许 NULL 值:
Schema::table('users', function ($table) { $table->string('name', 50)->nullable()->change();});
要重命名一个列,可以使用表结构构建器上的 renameColumn方法,在重命名一个列之前,确保 doctrine/dbal依赖已经添加到 composer.json文件:
Schema::table('users', function ($table) { $table->renameColumn('from', 'to');});
注意:暂不支持 enum类型的列的重命名。
要删除一个列,使用表结构构建器上的 dropColumn方法:
Schema::table('users', function ($table) { $table->dropColumn('votes');});
你可以传递列名数组到 dropColumn方法从表中删除多个列:
Schema::table('users', function ($table) { $table->dropColumn(['votes', 'avatar', 'location']);});
注意:在从SQLite数据库删除列之前,需要添加 doctrine/dbal依赖到 composer.json文件并在终端中运行 composer update命令来安装该库。此外,SQLite数据库暂不支持在单个迁移中删除或修改多个列。
表结构构建器支持多种类型的索引,首先,让我们看一个指定列值为唯一索引的例子。要创建索引,可以使用 unique方法:
$table->string('email')->unique();
此外,你可以在定义列之后创建索引,例如:
$table->unique('email');
你甚至可以传递列名数组到索引方法来创建组合索引:
$table->index(['account_id', 'created_at']);
Laravel 会自动生成合理的索引名称,但是你可以传递第二个参数到该方法用于指定索引名称:
$table->index('email', 'my_index_name');
命令 | 描述 |
---|---|
$table->primary('id'); | 添加主键索引 |
$table->primary(['first', 'last']); | 添加混合索引 |
$table->unique('email'); | 添加唯一索引 |
$table->unique('state', 'my_index_name'); | 指定自定义索引名称 |
$table->index('state'); | 添加普通索引 |
要删除索引,必须指定索引名。默认情况下,Laravel 自动分配适当的名称给索引——简单连接表名、列名和索引类型。下面是一些例子:
命令 | 描述 |
---|---|
$table->dropPrimary('users_id_primary'); | 从 “users”表中删除主键索引 |
$table->dropUnique('users_email_unique'); | 从 “users”表中删除唯一索引 |
$table->dropIndex('geo_state_index'); | 从 “geo”表中删除普通索引 |
Laravel 还提供了创建外键约束的支持,用于在数据库层面强制引用完整性。例如,我们在 posts表中定义了一个引用 users表的 id列的 user_id列:
Schema::table('posts', function ($table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users');});
你还可以为约束的“on delete”和“on update”属性指定期望的动作:
$table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');
要删除一个外键,可以使用 dropForeign方法。外键约束和索引使用同样的命名规则——连接表名、外键名然后加上“_foreign”后缀:
$table->dropForeign('posts_user_id_foreign');