MySQL の場合は,Laravel の php artisan migrate
コマンドでテーブルの生成をするためにはCREATE DATABASE
コマンドでデータベースを予め作成しなければなりません.SQLite でも database/database.sqlite ファイルを予め生成する必要があります.
その後は,Laravel の php artisan migrate
でテーブルを生成し,php artisan db:seed
でデータを挿入して,動作の確認を行いました.さらに,開発中のテストを繰り返すために,php artisan migrate:rollback
によるデータベースの初期化,php artisan migrate
によるテーブル生成,php artisan db:seed
によるデータ追加を頻繁に行います.
MongoDB の場合はここで説明したとおり,ドキュメント(RDBでのデータ,レコードのイメージ)の追加によって,自動的にデータベースやコレクション(RDB でのテーブルのイメージ)が生成されるため,必ずしも migration は必要ありません.php artisan db:seed
さえ実行すれば,自動的にデータベース,コレクションが生成され,ドキュメントが登録される.しかしながら,開発中にテストを繰り返す事を考えると,php artisan migrate:rollback
によるデータベースの初期化ができたほうが良いでしょう.
すでにコメントの投稿や編集,削除の機能ができている状態である.
まずは,MongoDB にログインして,データベースやコレクションを確認する.
[vagrant@localhost ~]$ mongo -u root ⏎ MongoDB shell version v4.2.3 Enter password: hogehoge ⏎ connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("643237a2-3b15-4246-bf2c-eb3a2d0833da") } MongoDB server version: 4.2.3 > show dbs; ⏎ admin 0.000GB config 0.000GB keijidb 0.000GB local 0.000GB > use keijidb; ⏎ switched to db keijidb > show collections; ⏎ comments >
次に,コレクションやデータベースを削除してみよう.
> db.comments.drop() ⏎ true > show collections; ⏎ > db.dropDatabase(); ⏎ { "dropped" : "keijidb", "ok" : 1 } > show dbs; ⏎ admin 0.000GB config 0.000GB local 0.000GB >
いま,コレクションやデータベースを削除したが,Web ブラウザで /comments にアクセスしても,エラーが表示されることはない.
データベースを削除した状態でも,新規に投稿することができました.
MongoDB で確認すると,新規の投稿処理でデータベースとコレクションが自動的に生成されていることがわかりました.
> show dbs; ⏎ admin 0.000GB config 0.000GB keijidb 0.000GB local 0.000GB > use keijidb; ⏎ switched to db keijidb > show collections; ⏎ comments > db.comments.find(); ⏎ { "_id" : ObjectId("5e475206586c9b4d8b2e3802"), "title" : "削除後に投稿", "body" : "コレクションとデータベースを削除した状態で投稿してみます.", "created_at" : ISODate("2020-02-15T02:05:58Z"), "updated_at" : ISODate("2020-02-15T02:05:58Z") } >
ここで,再度データベースを削除しておこう.
> db.dropDatabase(); ⏎ { "dropped" : "keijidb", "ok" : 1 } > show dbs; ⏎ admin 0.000GB config 0.000GB local 0.000GB >
次に,MongoDB を使った場合のマイグレーションとシーダの記述方法について説明する.マイグレーションファイルやシーダの書き方が若干異なることに注意しよう.
マイグレーションファイルの作成を行う.これは SQLite や MySQL の場合と同様です.ただし,ユーザ管理に関するマイグレーションファイルは削除しておこう.なお,rm
コマンドを使っているが,git でバージョン管理をしている場合には git rm
を使うと良い.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ cd database/migrations/ ⏎ [vagrant@localhost migrations]$ ls ⏎ 2014_10_12_000000_create_users_table.php 2014_10_12_100000_create_password_resets_table.php [vagrant@localhost migrations]$ rm 2014_10_12_000000_create_users_table.php ⏎ [vagrant@localhost migrations]$ rm 2014_10_12_100000_create_password_resets_table.php ⏎ [vagrant@localhost migrations]$ ls ⏎ [vagrant@localhost migrations]$ cd ../../ ⏎ [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan make:migration create_comments_table --create=comments ⏎ Created Migration: 2020_02_15_112821_create_comments_table [vagrant@localhost Laravel5.8-MongoDB-Connection]$ cd database/migrations/ ⏎ [vagrant@localhost migrations]$ ls ⏎ 2020_02_15_112821_create_comments_table.php [vagrant@localhost migrations]$ cd ../../ ⏎ [vagrant@localhost Laravel5.8-MongoDB-Connection]$
次に,シーダも作成しておく.このコマンドも SQLite の場合と同様です.なお,シーダを作成したあとは忘れず php ../composer.phar dump-autoload
を実行しておこう.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ ls database/seeds/ ⏎ DatabaseSeeder.php [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan make:seeder CommentsTableSeeder ⏎ Seeder created successfully. [vagrant@localhost Laravel5.8-MongoDB-Connection]$ ls database/seeds/ ⏎ CommentsTableSeeder.php DatabaseSeeder.php [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php ../composer.phar dump-autoload ⏎ Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: beyondcode/laravel-dump-server Discovered Package: fideloper/proxy Discovered Package: jenssegers/mongodb Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. Generated optimized autoload files containing 3806 classes [vagrant@localhost Laravel5.8-MongoDB-Connection]$
database/seeder/DatabaseSeeder.php と database/seeder/CommentsTableSeeder.php を編集する.
database/seeder/DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// $this->call(UsersTableSeeder::class);
$this->call(CommentsTableSeeder::class);
}
}
シーダの書き方も,モデルを使えば SQLite の場合と同様です.
database/seeder/CommentsTableSeeder.php
<?php
use Illuminate\Database\Seeder;
use App\Comment;
class CommentsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$comments = array(
array("最初のコメント", "ああああああ", "2020-02-13 00:00:03", "2020-02-13 00:00:03"),
array("ふたつめ", "コメント本文", "2020-02-13 20:14:00", "2020-02-13 20:14:00"),
array("3つ目", "コメント", "2020-02-13 20:16:00", "2020-02-13 20:16:00"),
array("4つ目のコメント", "本文", "2020-02-13 20:18:00", "2020-02-13 20:18:00"),
array("あいうてお", "あいうておあいうておあいうておあいうてお", "2020-02-13 20:50:00", "2020-02-13 20:50:00"),
array("かきくけこ", "かきくけこかきくけこ", "2020-02-13 21:14:00", "2020-02-13 21:14:00"),
array("さしすせそ", "さしすせそさしすせそ", "2020-02-13 22:14:00", "2020-02-13 22:14:00"),
);
foreach ($comments as $c) {
$comment = new Comment();
$comment->title = $c[0];
$comment->body = $c[1];
$comment->created_at = $c[2];
$comment->updated_at = $c[3];
$comment->save();
}
}
}
シーダーができたので,データベースが作成されいない状態でシーダを実行してみよう.まず,データベースが作成されていないことを MongoDB で確認する.
>show dbs; ⏎ admin 0.000GB config 0.000GB local 0.000GB >
次に,シーダを実行してデータ(ドキュメント)を投入する.もしもここでエラーが表示されたら,php ../composer.phar dump-autoload
コマンドを実行済みであるか確認しよう.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan db:seed ⏎ Seeding: CommentsTableSeeder Database seeding completed successfully. [vagrant@localhost Laravel5.8-MongoDB-Connection]$
再度,MongoDB でデータベース,コレクション,ドキュメントの一覧を確認する.シーダを実行することによって,migration を行うことなくこれらが全て作成されていることが確認できる.
> show dbs; ⏎ admin 0.000GB config 0.000GB keijidb 0.000GB local 0.000GB > use keijidb; ⏎ switched to db keijidb > show collections; ⏎ comments > db.comments.find() ⏎ { "_id" : ObjectId("5e475facaa6b5255ec7a7352"), "title" : "最初のコメント", "body" : "ああああああ", "created_at" : ISODate("2020-02-12T15:00:03Z"), "updated_at" : ISODate("2020-02-12T15:00:03Z") } { "_id" : ObjectId("5e475facaa6b5255ec7a7353"), "title" : "ふたつめ", "body" : "コメント本文", "created_at" : ISODate("2020-02-13T11:14:00Z"), "updated_at" : ISODate("2020-02-13T11:14:00Z") } { "_id" : ObjectId("5e475facaa6b5255ec7a7354"), "title" : "3つ目", "body" : "コメント", "created_at" : ISODate("2020-02-13T11:16:00Z"), "updated_at" : ISODate("2020-02-13T11:16:00Z") } { "_id" : ObjectId("5e475facaa6b5255ec7a7355"), "title" : "4つ目のコメント", "body" : "本文", "created_at" : ISODate("2020-02-13T11:18:00Z"), "updated_at" : ISODate("2020-02-13T11:18:00Z") } { "_id" : ObjectId("5e475facaa6b5255ec7a7356"), "title" : "あいうてお", "body" : "あいうておあいうておあいうておあいうてお", "created_at" : ISODate("2020-02-13T11:50:00Z"), "updated_at" : ISODate("2020-02-13T11:50:00Z") } { "_id" : ObjectId("5e475facaa6b5255ec7a7357"), "title" : "かきくけこ", "body" : "かきくけこかきくけこ", "created_at" : ISODate("2020-02-13T12:14:00Z"), "updated_at" : ISODate("2020-02-13T12:14:00Z") } { "_id" : ObjectId("5e475facaa6b5255ec7a7358"), "title" : "さしすせそ", "body" : "さしすせそさしすせそ", "created_at" : ISODate("2020-02-13T13:14:00Z"), "updated_at" : ISODate("2020-02-13T13:14:00Z") } >
MongoDB を使ったときには,マイグレーションファイルの書き方が異なるので注意が必要である.なお,ドキュメントの追加によってコレクションが自動生成されるので,up()
関数の中身は特に必要ない.ロールバックの際に実行される down()
関数を記述する(MongoDB 用に書き換える).
database/migrations/20yy_mm_dd_hhmmss_create_comments_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCommentsTable extends Migration
{
// MongoDB のコネクションを指定する
protected $connection = 'mongodb';
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// up() は特に記述する必要はないが,あえて次のように書いても良い.
// Schema::connection($this->connection)
// ->table('comments', function (Blueprint $collection)
// {
// $collection->string('title');
// $collection->string('body');
// });
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection($this->connection)
->table('comments', function (Blueprint $collection)
{
$collection->drop();
});
}
}
マイグレーションファイルを作成したが,マイグレーションを実行していないため,ロールバックができない.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate:status ⏎ Migration table not found. [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate:rollback ⏎ Nothing to rollback. [vagrant@localhost Laravel5.8-MongoDB-Connection]$
マイグレーションを実行すると,作成したテーブル(コレクション)の情報が migrations テーブル(コレクション)に登録されるので,ロールバックが実行できるようになる.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate ⏎ Migrating: 2020_02_13_213426_create_comments_table Migrated: 2020_02_13_213426_create_comments_table (0 seconds) [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate:status ⏎ +------+-----------------------------------------+-------+ | Ran? | Migration | Batch | +------+-----------------------------------------+-------+ | Yes | 2020_02_13_213426_create_comments_table | 1 | +------+-----------------------------------------+-------+ [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate:rollback ⏎ Rolling back: 2020_02_13_213426_create_comments_table Rolled back: 2020_02_13_213426_create_comments_table (0.01 seconds) [vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate:status ⏎ +------+-----------------------------------------+-------+ | Ran? | Migration | Batch | +------+-----------------------------------------+-------+ | No | 2020_02_13_213426_create_comments_table | | +------+-----------------------------------------+-------+ [vagrant@localhost Laravel5.8-MongoDB-Connection]$
以上のように,MongoDB の場合でもマイグレーションファイルの書き方が異なるが,migrate, db:seed, migrate:rollback の各コマンドを使った操作が可能である.つまり,開発途中では次のようなコマンドを頻繁に実行することになるでしょう.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan migrate:rollback; php artisan migrate; php artisan db:seed ⏎ Rolling back: 2020_02_13_213426_create_comments_table Rolled back: 2020_02_13_213426_create_comments_table (0 seconds) Migrating: 2020_02_13_213426_create_comments_table Migrated: 2020_02_13_213426_create_comments_table (0 seconds) Seeding: CommentsTableSeeder Database seeding completed successfully. [vagrant@localhost Laravel5.8-MongoDB-Connection]$