Laravel 以外のプロジェクトで Illuminate Database を使う(基本編)
Laravel での開発に慣れてくると、他のプロジェクトでもデータベースの操作にクエリビルダや ORM を使いたくなると思います。SQL を直接書くと間違いやすいですし、扱う RDBMS によって文法も微妙に違いますしね。
ということで、Laravel 以外のプロジェクトで Illuminate Database を使えるようにする方法をまとめてみます。
ファイル構成
先に今回の記事のゴールとなるファイル構成を示しておきます(説明に必要のないフォルダ等は省略しています)。
(project root)
│
├─database
│  │  
│  ├─Models
│  │  └─User.php
│  │
│  └─bootstrap.php
│          
├─vendor
│  └─autoload.php
│
├─.env
├─composer.json
└─composer.lock
必要なパッケージのインストール
まずは必要なパッケージのインストールから。データベースの接続情報を個々のファイルに記載するのはセキュリティ上のリスクがあるので、.env ファイルにまとめることにします。ということで、composer を使って必要なパッケージをインストールします。
composer require illuminate/database "~6.0"
composer require vlucas/phpdotenv "~5.0"
.env に接続に必要な情報を記載
こんな感じですかね
# データベース設定
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=db_user
DB_PASSWORD=db_password
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_general_ci
Illuminate Database を使うための共通処理
次に、Illuminate Database を使うための共通処理を bootstrap.php に記載していきます。このスクリプトを require することで、個々の PHP スクリプトで Illuminate Database が使えるようになります。
<?php
$root_dir = dirname(__DIR__);
require_once($root_dir . '/vendor/autoload.php');
class_alias(Illuminate\Database\Capsule\Manager::class, 'DB');
$dotenv = Dotenv\Dotenv::createImmutable($root_dir);
if (file_exists($root_dir . '/.env')) {
    $dotenv->load();
}
$database = new DB();
$database->addConnection([
    'driver' => $_ENV['DB_CONNECTION'],
    'host' => $_ENV['DB_HOST'],
    'port' => $_ENV['DB_PORT'],
    'database' => $_ENV['DB_DATABASE'],
    'username' => $_ENV['DB_USERNAME'],
    'password' => $_ENV['DB_PASSWORD'],
    'charset' => $_ENV['DB_CHARSET'],
    'collation' => $_ENV['DB_COLLATION'],
]);
$database->setAsGlobal();
$database->bootEloquent();
class_alias でクラス名として DB を使えるようにしたので、個々の PHP スクリプトの中で、Laravel のマニュアルと同様
$users = DB::table('users')->get();
と書けるようになります。
Eloquent ORM を使う
Eloquent ORM も普通に使うことができます。クラスのオートロードが使えると何かと便利なので、composer.json に追記します。
{
    "require": {
        "vlucas/phpdotenv": "~5.0",
        "illuminate/database": "~6.0"
    },
    "autoload": {
        "classmap": ["database"]
    }
}
autoload の項目を追加し、composer dump-autoload することで、database ディレクトリ以下のファイルをオートロードしてくれます。
そのうえで、モデルの定義はこんな感じ。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
    public function phones()
    {
        return $this->hasMany('App\Phone')
    }
}
Laravel のマニュアル通りです。
次回予告
フレームワークを使ってデータベースを扱うメリットとして、マイグレーションやシーディングをコマンドラインから管理できることもあると思います。Laravel であれば、artisan コマンドを使って行うことができますが、illuminate/database パッケージだけでは、コマンドラインからマイグレーションやシーディングを行うことができません。次回は、このあたりに対応できるようにします。
ディスカッション
コメント一覧
まだ、コメントがありません