質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

マイグレーションについて質問させてください

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,057
退会済みユーザー

退会済みユーザー

今は一人で開発しているのでマイグレーションを使わず、必要に応じて直接DBを操作しています。しかし将来チーム開発になったときのことを考え、マイグレーションを活用したいと考えています。そこで色々ネット上の記事を読んだのですが、全体感が分からないので質問させてください。

1.マイグレーションファイルを生成する単位
テーブル作成、カラム追加など、何か変更を加えようとするたびにファイルを1個ずつ追加するのでしょうか。また1つのファイルの中に、複数テーブルに対する変更は1ファイル内に記述できるのでしょうか。

2.ファイル名には意味があるのでしょうか
環境構築すると、サンプルとして2014_10_12_000000_create_users_tables.phpというファイルが出来あがります。
この「2014_10_12_000000」の部分は、ロールフォワード・ロールバックする際の時系列の判断のために参照されているのでしょうか。それともファイルのタイムスタンプが参照されているのでしょうか。
その先の「create」や「users_table」にはシステム上の意味や制約はあるのでしょうか。(質問1と関連しますが)

3.マイグレーションファイルを手作業で作成して問題はありますか。
php artisan make:migration tablename を使っても、出来上がるファイルの中身はほとんど空なので、あえてコマンドを使う意味が分かりません。既存のファイルをコピー・編集して新規ファイルを作成することに問題はありますでしょうか。(質問1・質問2の結果にも多少影響を受けますが)

4.モデル内の記述変更を伴うようなテーブル設計変更(プライマリキーを変える、複数DBを相手にするなど)の場合、マイグレーションではどのように管理するのかがイメージできません。

以上、ご教示いただけますと幸いです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

長文で申し訳ありません。


1.マイグレーションファイルを生成する単位

システム的な制約はありません。
1つのマイグレーションファイルから複数のテーブルを作成したり、複数のデータベースに対して操作をしたりといった事も一応可能です。
テーブル単位で、機能としてまとまった括りで、あるいは機能改修や要件毎でと、分割単位は人によって変わる部分でもあります。
テーブルの作成と、外部キーの付与を別のマイグレーションにするといった方法もあります。


2.ファイル名には意味があるのでしょうか 

ファイル名は、以下の目的で利用されます。

  • マイグレーションを行う順番のソート
  • 既にマイグレーションを行ったかどうかの判定
  • マイグレーションファイルのクラス名との結びつけ

適当な名前でも大丈夫か?というと答えはNOなのですが、テーブル作成するならcreateや、対象のテーブル名をファイル名に含めないといけないか?と言うとそれもNOです。
以下、上記の考慮すべき内容を補足します。

migrateコマンドにより一度に複数のマイグレーションファイルを実行する場合、
ファイル名をphpのsort関数にかけた上での順番で実行されます。
外部キーなどの付与などは親テーブルが存在しないといけませんから、順番を考慮するケースはあります。

一度マイグレーションを行ったファイル名は、migrationsテーブルに格納されます。
適用済みかそうでないかの判定材料に使われるのですが、マイグレーション適用後にファイル名を変更すると、別物として認識されてしまいますので、途中での変更はやめた方がいいでしょう。

更にマイグレーション時、クラスをインスタンス化するため、クラス名をファイル名から作成するのですが、以下のような事をやってます。

implode('_', array_slice(explode('_', $file), 4));

$class = Str::studly($file);

ファイル名をアンダーバーで分割した時に、最初の4つを捨てた残りで組み立てています。
つまり、2014_10_12_000000_create_users_tables の日付時間の部分を除外し、
残ったcreate_users_tablesCreateUsersTablesというクラス名を求めています。
なので、ファイル名と、そのファイルの中のclass名がちぐはぐだと正しく動きません。

これらを考慮した上でならファイル名は自由ですが、とはいえやはり
php artisan make:migrationで作成される書式に合わせるのが楽かと思います。


3.マイグレーションファイルを手作業で作成して問題はありますか。

手動でも特に問題ありません、が、コマンドで作ると、上で説明したような
意味のあるファイル名と連動したクラス名を自動的につけてくれる他、
内部で自動的にcomposer dump-autoloadを行ってくれるので、楽にはなるかなと。


4.モデル内の記述変更を伴うようなテーブル設計変更

例えば元々主キーのカラムがkey1だったのに、key2になったという場合は以下のように書けます。

Schema::table('some_tables', function ($table) {
    $table->dropPrimary('key1');
    $table->primary('key2');
});

複数DBを相手にするというのがちょっとわかりませんが、
Schemaのconnectionメソッドで、接続先のdatabase設定を切り替えられます。

Schema::connection('hoge')->table('some_table', function () {
    //
});


これで答えになっていますでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/27 16:31

    Archsted様、丁寧な解説を付けていただき、ありがとうございます。
    想像していたより遥かに複雑なことを内部的にはやっているということが分かりました。
    ひとまず開発にマストの機能ではないのでスキーマ変更等は別で管理することにいたします。ただいつまでも分からないままにはしたくないので、テスト環境で試しながら理解していきたいと思います。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる