福岡拠点の香月です。
前回はLaravelのプロジェクトを作成しました。
今回はこれにDBへのアクセス設定と、モデルの追加及びDBのマイグレーションを行います。
DBへのアクセス設定はアプリケーションのルートフォルダにある.envファイルで行います。この.envファイルは.env.exampleを元に作成されます。
開発環境、検証環境、本番環境でそれぞれ異なる設定なのでその環境ごとのファイル.env.develop、.env.staging、.env.productionを作成することになるでしょう。リリース時にはリリース環境にあったファイルを.envにリネームします。
※Laravelでは.envはソース管理に含めないことがガイドラインに書いてあります。これはプロジェクトのルートフォルダにある.gitignoreを見ても明らかです。
さて .env を編集する前に、アプリケーションで使用する mysql のユーザーを作成します。また、使用するDBを作成します。
1 2 3 4 5 6 |
# mysql -uroot -p Enter password: mysql> create database scoresheet; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX,TRIGGER ON scoresheet.* TO ss_user@localhost IDENTIFIED BY 'password'; mysql> GRANT SELECT ON *.* TO watcher@'%' IDENTIFIED BY 'readonly'; mysql> flush privileges; |
1行目でmysqlにrootユーザーでログインします。
3行目でアプリケーションで使用するデータベースを「scoresheet」という名前で作成します。
4行目ではデータベース使用するユーザーとして「ss_user@localhost」を作成しつつ、必要な権限設定を行います。
5行目では山椒の実のユーザーを作成します。
6行目で権限を反映します。
これでDBの準備が整いました。
.env を開くと、DBに関する設定を行う場所があるのでここに情報を記載します。
1 2 3 4 5 6 |
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=scoresheet DB_USERNAME=ss_user DB_PASSWORD=password |
※本当の設定箇所は config/database.php です。しかし環境ごとに異なるなので.envに記載し、database.phpからは.envを参照するようになっています。
DBへのアクセス設定ができたので、ここからはモデルの作成とテーブルを追加する作業、マイグレーションです。アプリケーションのルートフォルダで
1 |
# php artisan make:model Score -m |
を実行すると モデルクラス用のファイルが作成されます。-mオプションでマイグレーションファイルも一緒に作成されるので、モデルを作成するときは指定しましょう。
app\Score.php
database/migrations/<日付_時間>_create_scores_table.php
モデル名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。「Score」は「scores」になります。Laravelは内部に辞書をもっており、英単語を適切に複数形にしてくれます。ネイティブじゃない私にはありがたい機能です。
あとはこれを編集して必要なフィールドを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateScoresTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('scores', function (Blueprint $table) { $table->increments('id'); $table->integer('student_id'); $table->integer('subject_id'); $table->timestamp('exam_day'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('scores'); } } |
これとは別にLaravelではプロジェクト作成時にusers、password_resetsテーブル用のマイグレーションファイルが作成されています。認証用ですね。
これと今作成したマイグレーションファイルのすべてが次のコマンドでまとめて
DBに登録されます。
1 2 3 4 5 6 7 |
# php artisan migrate Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table Migrating: 2018_xx_xx_xxxxxx_create_scores_table Migrated: 2018_xx_xx_xxxxxx_create_scores_table |
「php artisan migrate:status」でマイグレーション結果を確認できます。
1 2 3 4 5 6 7 8 |
# php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2018_xx_xx_xxxxxx_create_scores_table | 1 | +------+------------------------------------------------+-------+ |
※一度もマイグレーションを実行していない状態で実行するとエラーが出てしまいます。
1 2 3 4 5 |
# php artisan migrate:status Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user 'ss_user'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = scoresheet and table_name = migrations) |
「migrations」というテーブルが無い!と怒られるのですが、このテーブルは最初にマイグレーションを実行したときに作成されます。これを知らずにちょっとはまりました。
モデル及びテーブルがもっと必要な場合は「php artisan make:model xxx -m」を必要なだけ繰り返しましょう。最後に「php aritisan migrate」を忘れずに。
プログラムはこのモデルを使ってデータにアクセスしていきますよー。