設定

Laravelはデータベースとの接続、クエリーの実行をとても簡単にしてくれます。データベース設定ファイルはconfig/database.phpです。このファイルで使用するデータベース接続を全部定義すると同時に、デフォルトで使用する接続も指定してください。サポートしている全データベースシステムの例がファイルの中に用意しています。

現在LaravelがサポートしてるデータベースシステムはMySQL、Postgres、SQLite、SQL Serverです。

Read/Write接続

SELECT文に別のデータベース接続を利用したい場合もあると思います。INSERT、UPDATE、DELETE文では他の接続に切り替えたい場合などです。Laravelでこれを簡単に実現できます。SQLをそのまま使う場合であろうと、クエリービルダーやEloquent ORMを利用する場合であろうと、適切な接続が利用されます。

Read/Write接続を理解してもらうため、以下の例をご覧ください。

'mysql' => [
    'read' => [
        'host' => '192.168.1.1',
    ],
    'write' => [
        'host' => '196.168.1.2'
    ],
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
],

設定配列にreadwrite、2つのキーが追加されたことに注目して下さい。2つのキーともhostというキーを一つ持っています。readwrite接続時の残りのデータベースオプションは、メインのmysql配列からマージされます。ですから、readwriteの配列には、メインの配列の値をオーバーライドしたいものだけ指定してください。この場合、192.168.1.1は"read"接続に利用され、一方192.168.1.2が"write"接続に利用されます。メインのmysql配列に含まれる、データベース接続情報、プレフィックス、文字セットなどその他のオプションは、両方の接続で共有されます。

クエリーの実行

データベース接続の設定を済ませれば、DBファサードを使用しクエリーを実行できます。

SELECTクエリーの実行

$results = DB::select('select * from users where id = ?', [1]);

selectメソッドはいつも結果を配列でリターンします。

もしくは結合に名前を指定し、クエリーを実行することもできます。

$results = DB::select('select * from users where id = :id', ['id' => 1]);

INSERT文の実行

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

UPDATE文の実行

DB::update('update users set votes = 100 where name = ?', ['John']);

DELETE文の実行

DB::delete('delete from users');

注目: updatedelete文はその操作により影響を受けるレコード数をリターンします。

通常のSQL文を実行する

DB::statement('drop table users');

クエリーイベントの購読

DB::listenメソッドを使用し、クエリーイベントを購読することが可能です。

DB::listen(function($sql, $bindings, $time)
{
    //
});

データベーストランザクション

データベーストランザクションを使用して一連の操作を実行する場合は、transactionメソッドを使ってください。

DB::transaction(function()
{
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

注意: transactionのクロージャーの中でどんな例外が投げられても、自動的にそのトランザクションはロールバックされます。

自分でトランザクションを始める必要がある場合もあるでしょう。

DB::beginTransaction();

トランザクションをロールバックするには、rollbackメソッドを使用します。

DB::rollback();

最後はトランザクションのコミットのための、commitメソッドです。

DB::commit();

コネクションとの接続

複数のコネクションを使用するときはDB::connectionメソッドが使用できます。

$users = DB::connection('foo')->select(...);

裏で動作している、PDOインスタンスにアクセスすることもできます。

$pdo = DB::connection()->getPdo();

時には、指定したデータベースに再接続する必要があるでしょう。

DB::reconnect('foo');

裏で動作しているPDOインスタンスがmax_connections制限を超えてしまい、指定したデータベースとの接続を切りたい場合は、disconnectメソッドを使用して下さい。

DB::disconnect('foo');

クエリーのログ

現在のリクエスト中に実行された全クエリーをメモリーにログしておくことも可能です。大量の行を挿入するようなケースでは、これにより大量のメモリーが使用されることに注意を払ってください。ログを有効にするには、enableQueryLogメソッドを使用してください。

DB::connection()->enableQueryLog();

実行済みのクエリーの配列を取得するために、getQueryLogメソッドが使用できます。

$queries = DB::getQueryLog();