Help us understand the problem. What is going on with this article?

LaravelのSeederで混乱した話

はじめに

自分のスキル感

実務でLaravel,PHPを触り始めて4ヶ月程度
バリバリの駆け出しエンジニアです。

実務でseederを扱って混乱したことがあるので、メモ書き程度にまとめておきます。
同じような境遇に人の役に立てば幸いです。

独学で勉強している時はあまりなんとも思わなかったのですが、環境の差異で軽く混乱しました。
勉強しているは平気で本番環境のデータベースををmigrateしなおしたり、
データを流し直したりしまくっていましたが、実務ではそうはいきません。

(注)自分が経験した現場での話なので、やり方は多数あるかもしれませんので、その辺はご了承ください。

Laravelのseeder作成から反映させるまでの流れ

自分が実務で経験した本番環境のデータベースをデータを変更したりする場合の手順は以下の通り
  1. データを変更するseeder(ここでは適当にExampleSeeder.phpとする)を作成+変更部分を記述
  2. laravelの場合,DatabaseSeeder.phpへ作成したSeederファイルの追加(DatabaseSeeder.phpの中に含まれる元からあるSeederファイルを変更するという手もありますが、あまり良くないかも)
  3. コードが良さそうであれば、マージした後に、以下のコマンドで変更を加えたSeederを本番環境で流す
$ php artisan db:seed --class=ExampleSeeder

雑にまとめるとこんな感じだろうか。

どこで混乱したか

上記の流れで厄介なのが、2の手順である。

もし仮に2の手順を飛ばしてマージされたとしたら、、、どうなるのか。。(ガクブル)

本番環境では単独でseederファイルを流します。

ローカルはどうなるかというと、、、
変更部分がマージされた後に、masterブランチpullしてきて、下記のコマンドを叩きます。

$ php artisan migrate:fresh --seed

すると、、、
本番環境では反映されているデータの変更が、ローカルには反映されません。(ここではExampleSeederが流れない)
なぜか。

php artisan migrate:fresh --seed

上記コマンドで流れるseederとはDatabaseSeeder.phpに記載しているseederファイルだからです。
このコマンドを叩いたから全てのseederファイルが流れるわけではありません

ここが注意すべきところです。

1と3だけでも本番環境には反映させることができます。

しかし、ローカル環境でも変更を反映させるためには変更を加えたseederファイルをDatabaseSeeder.phpへ追加する必要があるのです。

こういうのが積み重なり、本番環境とローカル環境,develop環境など、環境ごとに差異が出てきます。
そして本番環境でしか起こり得ないバグなど、ローカルでは調査しづらいバグの根本的な原因にもなってくるわけです。
恐ろしい

Seederを使う人は注意しましょう。。。。

終わりに

最後まで読んでいただいてありがとうございます。
何か間違っていることがあればぜひぜひご指摘ください!

enomotoakira
初めまして! 駆け出しエンジニアをやっています24才です。 何卒よろしくお願いします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away