まずは,Laravel のプロジェクトを作成する.
[vagrant@localhost laravel]$ pwd ⏎ /home/vagrant/Documents/laravel [vagrant@localhost laravel]$ ls ⏎ composer.phar [vagrant@localhost laravel]$ php composer.phar create-project --prefer-dist laravel/laravel Laravel5.8-MongoDB-Connection ⏎ Installing laravel/laravel (v5.8.35) - Installing laravel/laravel (v5.8.35): Downloading (100%) Created project in connect-mongodb ...(中略)... Package manifest generated successfully. > @php artisan key:generate --ansi Application key set successfully. [vagrant@localhost laravel]$
プロジェクトの初期設定を行う.まずは,.env ファイルを編集して,バックエンドのデータベースを sqlite にしておく(後で MongoDB に変更する).
.env (抜粋)
DB_CONNECTION=sqlite
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
次に,config/app.php でタイムゾーンと言語の設定を行う.
config/app.php (抜粋)
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'Asia/Tokyo',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'ja',
SQLite のデータベースファイルも作成しておく.このデータベースを利用することはないが,ここで作成しておかなければ,後の作業でエラーとなる可能性が高い.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ touch database/database.sqlite ⏎ [vagrant@localhost Laravel5.8-MongoDB-Connection]$
ここで,Web サーバを起動して,Web ブラウザから Laravel トップページにアクセスできることを確認しておこう.
Laravel から MongoDB にアクセスするためには,Jenssegers/Mongodb パッケージをインストールしなければならない.このために,次のコマンドを実行する.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php ../composer.phar require jenssegers/mongodb ⏎ Using version ^3.6 for jenssegers/mongodb ./composer.json has been updated ...(中略)... Package manifest generated successfully. [vagrant@localhost Laravel5.8-MongoDB-Connection]$
Jenssegers/Mongodb パッケージがインストールできたら,.env に設定情報を記述する.具体的には,データベースの接続情報を sqlite から mongodb に変更し,mongodb のデータベース名,ユーザ名,パスワードなどを設定する.
.env (抜粋)
# DB_CONNECTION=sqlite
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=keijidb
DB_USERNAME=root
DB_PASSWORD=hogehoge
DB_AUTHENTICATION_DATABASE=admin
さらに,config/database.php と config/app.php を編集する.
config/database.php (抜粋)
'connections' => [
・・・(中略)...
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],
'mongodb' => [
'driver' => 'mongodb',
'host' => env('DB_HOST'),
'port' => env('DB_PORT'),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'options' => [
'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'),
],
],
],
config/app.php (抜粋)
'providers' => [
/*
* Laravel Framework Service Providers...
*/
...(中略)...
/*
* Package Service Providers...
*/
Jenssegers\Mongodb\MongodbServiceProvider::class,
/*
* Application Service Providers...
*/
...(中略)...
],
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => [
...(中略)...
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'Moloquent' => Jenssegers\Mongodb\Eloquent\Model::class,
],
];
Comment モデルを作成して,データベースのコレクション名(テーブル名のイメージ)を指定する.まず,Comment モデルを作成する.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan make:model Comment ⏎ Model created successfully. [vagrant@localhost Laravel5.8-MongoDB-Connection]$
次に,作成された app/Comment.php へモデルに関連付けるコレクション名を指定する.例によって,モデルは単数形で,コレクション名は複数形で記述することに注意しよう.
app/Comment.php
<?php
namespace App;
// use Illuminate\Database\Eloquent\Model; // ここをコメントアウトする
use Jenssegers\Mongodb\Eloquent\Model as Moloquent;
class Comment extends Moloquent
{
// データベースのコレクション名を指定する
// (RDM のテーブル名のようなイメージ)
protected $collection = 'comments';
}
「/comments」という URL にアクセスしたときに,comments の一覧を表示したいので,そのルートを記述する.
routes/web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/comments', 'CommentsController@index');
モデルとルートの設定ができたので,最後にコントローラを作成して,実際に MongoDB からデータを取り出してみよう.まず,CommentsController を作成する.
[vagrant@localhost Laravel5.8-MongoDB-Connection]$ php artisan make:controller CommentsController ⏎ Controller created successfully. [vagrant@localhost Laravel5.8-MongoDB-Connection]$
上のコマンドで app/Http/Controllers/CommentsController.php が生成されたので,このファイルに index 関数を追加する.
app/Http/Controllers/CommentsController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Comment;
class CommentsController extends Controller
{
public function index()
{
$comments = Comment::get();
dd($comments);
}
}
ここまでできれば,Webサーバを起動してブラウザからアクセスしてみよう.MongoDB に登録した comments コレクションの一覧を正しく取得できていることが確認できる.
データベースのマイグレーションに関する部分を除いて,その後の作成は SQLite を使った場合と同様の方法で可能です.