Laravel入門トップページ


目次

  1. Composerのダウンロードとインストール
  2. コメント掲示板を作成してみよう
  3. リレーションシップを使いこなそう
  4. ユーザ認証の機能を実現しよう
  5. マルチ認証の機能を実現しよう
  6. MongoDB に接続しよう
    1. 概要と MongoDB の準備
    2. Laravel から MongoDB へ接続する
    3. Laravel での MongoDB マイグレーション
  7. キューを利用しよう
  8. コマンド(コンソール)を利用しよう
  9. 本番環境にデプロイしよう

MongoDB に接続しよう

Laravel での MongoDB マイグレーション

目次に戻る

概要

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-2

まずは,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-3

データベースを削除した状態でも,新規に投稿することができました.

mongodb-4

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]$

目次に戻る