こんにちは!あっきーです!
Webサイトではデータベースの構築って絶対必要ですよね!
でも、データベースってコマンドラインで構築したり、phpMyAdmin などの専用の管理画面から構築したりで結構大変です。データベース専門のエンジニアがいるくらいに奥が深いものです。
実は Laravel ではデータベースマイグレーションという仕組みがあります。
データベースマイグレーションとは、最初にデータベースを作成するための構造を PHP ファイルで定義することです。
つまり、専用の管理画面などを必要とせず PHP コードからデータベーステーブルの定義、更新、削除をすることができる。
という簡単な仕組みが備わっています。
本日はデータベースマイグレーションを使用するための設定と実際に簡単なデータベーステーブルの作成をしていきます!
Laravel がはじめてのかたは、上記の記事を参照に Laravel の実行環境を整えてからこちらの記事を参照してください!
MySQL のバージョンを5.7にアップデートする
最初にデータベースのアップデートを行います。
標準で搭載されている MySQL を使用していきます。
実は MySQL はなにもしなくても目でみえないところでずっとプログラムが動いています。
ですのでいったん動作をとめてからアップデートを行いましょう。
・MySQL を止める
ターミナル
1 |
$ sudo service mysqld stop |
・現在の MySQL のバージョンを削除する
ターミナル
1 |
$ sudo yum -y erase mysql-config mysql55-server mysql55-libs mysql55 |
実行結果:
Complete! の文字が出れば無事削除完了です。
・新しいバージョンの MySQL をインストールする
ターミナル
1 |
$ sudo yum -y install mysql57-server mysql57 |
実行結果:
これもまた Complete! の文字が出れば無事インストール完了です。
・MySQL を起動する
ターミナル
1 |
$ sudo service mysqld start |
・MySQL のバージョンを確認する
ターミナル
1 |
$ mysql --version |
データベースを作成する
・MySQL にログインする
ターミナル
1 |
$ mysql -u root -p |
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
このエラーが出たときは MySQL が起動してないため起こるエラーです。
$ sudo service mysqld start
コマンドを忘れていないか確認してください。
・データベースを作成する
ターミナル
1 |
$ create database laravel; |
今回は laravel という名前のデータベースを作成しました。
・作成したデータベースを確認する
ターミナル
1 |
$ show databases; |
実行結果:
「laravel」という名前のデータベースがあることを確認します。
・作成したデータベースを選択する
ターミナル
1 |
$ use laravel |
・データベーステーブルを確認する
ターミナル
1 |
$ show tables; |
とありますのでまだテーブルはないことが確認できます。
ここからデータベースマイグレーションでテーブルを作成していきますので MySQL からログアウトします。
・MySQL からログアウト
ターミナル
1 |
$ exit; |
データベースマイグレーションでテーブル作成する
いよいよマイグレーションデータベースを作成していきます。
以下の手順で行っていきます。
②マイグレーションファイルの構造を確認する
③マイグレーションファイルに追加記述する
④バージョンによる不具合を修正する
⑥マイグレーションを実行する
⑦MySQL にて実行確認する
マイグレーションファイルを作成する
テーブルをつくっていくのですが、せっかくなのでなにかシチュエーションで考えた方がいいかと思いましたので、
「本の販売管理システムを構築」
こんな前提でテーブルを作っていこうと思います。
・ファイル作成
ターミナル
1 |
$ php artisan make:migration create_books_table --create=books; |
※「create_books_table」というファイルを作成しました。
※「books」という名前のテーブルを作成しました。
実行結果:
「database/migrations/」のディレクトリの配下に 「create_books_table.php」というファイルが作成されたことが確認できます。
マイグレーションファイルの構造を確認する
マイグレーションコマンドを実行すると作成したファイル内に「up」「down」の2つのメソッドが作成されていることを確認できます。
create_books_table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// up メソッド //新しいテーブル、カラム、インデックスを追加していく public function up() { Schema::create('books', function (Blueprint $table) { $table->increments('id'); //カラム定義 //ここに新しいカラムを追加していく $table->timestamps(); //カラム定義 }); } // down メソッド // up メソッドで作成したテーブルを削除する public function down() { Schema::dropIfExists('books'); } |
マイグレーションファイルに追加記述する
「create_books_table.php」ファイルに記述を追加していきます。
「本の販売管理システムを構築」の前提に沿ったテーブルを検討します。
今回は必要最低限ということで
・本の名前
・在庫
・金額
・出版日
上記4カラム追加します。
・本の名前 == name
・在庫 == number
・金額 == price
・出版日 == published
という名前のカラムを作成します。
create_books_table.php
1 2 3 4 5 6 7 8 9 10 11 |
public function up() { Schema::create('books', function (Blueprint $table) { $table->increments('id'); $table->string('id'); $table->integer('id'); $table->integer('id'); $table->datetime('id'); $table->timestamps(); }); } |
上記のようにカラムをファイルに追加してください
バージョンによる不具合を修正する
※Laravel 5.4 以上を使用しているかたは実行してください。
解説:
Laravel 5.4 以上から標準の charset が utf8mb4 に変更され、標準の varchar(255) が設定されていると Cloud9 のMySQL バージョンではエラーになるため varchar(191) に変更することで解消しています。
app/Providers/AppServiceProvider.php
画像のパスのファイルに対して修正を行ってください。
マイグレーションを実行する
ここでテーブルを作成します
・テーブルを作成する
ターミナル
1 |
$ php artisan migrate; |
多分ここでエラーになります。
教材通りに進めていたら僕もここらでエラーはまりました。エラー内容は以下です。
・・・中略1 PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES)")
/home/ec2-user/environment/test/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:702 PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=homestead", "homestead", "secret", [])
/home/ec2-user/environment/test/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
やんわりエラー内容みるとこんな感じのこといってるきがします。
・データベースの接続拒否するよ。
・理由としてはユーザー名が違うよ。
・あと、君データベースの接続のときにデータベースの名前は「homestead」でパスワードは「secret」らしいじゃん。
てことでみなさん思い出してみてください。
MySQLにログインするときに「homestead」なんてユーザー名記述しましたっけ?
パスワードに「secret」なんて記述しましたっけ?
多分ここらに原因がありそうですね。
エラー解析していきましょう。
エラー対応
データベースの設定は2ヶ所あります。
「config/database.php」と「.env」ファイルの2つです。
基本的に「database.php」よりも「.env」ファイルの設定のほうが優先されるため「database.php」の訂正が上書きされている場合があります。
つまりデータベースの設定は「.env」ファイルで行いましょう。
だがしかし!
「.」から始まるファイルは隠しファイルといい、デフォルトで表示されていない場合もあります。
しかも「.env」がない場合もあるらしいです。(これは本当かどうか実際知りませんw)
ファイルが見当たらない場合、隠しファイルを表示させる設定をまず行いましょう。
それでなければ「.env.example」ファイルから「.env」ファイルをコピーするようです。
・隠しファイルを表示する
メニューバーの歯車マークから「Show Hidden Files」をチェックします。
すると赤線あたりに「.env」ファイルが表示されます。
・.env.exampleファイルから.envファイルをコピーする。
ターミナル
1 |
$ copy .env.example .env |
・.envファイルの中身を確認する
画像の枠の部分をみると設定した覚えのないデータベースの名前とかパスワードが入ってますね。
MySQL にログインしたときは「mysql -u root -p」とコマンドを入力したと思います。
これは ユーザーネームは「root」パスワードは「空白」という意味です。
あとデータベースの名前が「homestead」になってますが「laravel」で作成しましたよね。
以上を踏まえて
.env
1 2 3 4 5 6 |
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= |
に設定を変更してください。
そしてもういちどマイグレーションコマンドを実行します。
ターミナル
1 |
$ php artisan migrate; |
「create」とかの文字が表示されているので成功してるみたいですね。
これでテーブル作成完了です。
MySQL にて実行確認する
最後に MySQL に接続して実行確認をします。
・MySQL にログインする
ターミナル
1 |
$ mysql -u root -p; |
・作成したデータベースを選択する
ターミナル
1 |
$ use laravel; |
・データベーステーブルを確認する
ターミナル
1 2 |
$ show tables; $ desc books; |
実行結果:
先ほど追加したカラムが設定されていることが確認できます。
これでマイグレーションデータベースでのテーブル作成は完了です。
さいごに
結構エラーはまった経緯なども書いて難しそうにみえたかもしてませんがしっかり理解していればつまずくこともないことだろうと思います。
今後 Laravel を学習する際の参考になれば幸いです。