設定
Laravelはデータベースとの接続、クエリーの実行をとても簡単にしてくれます。データベース設定ファイルはapp/config/database.php
です。このファイルで使用するデータベース接続を全部定義すると同時に、デフォルトで使用する接続も指定してください。サポートしている全データベースシステムの例はファイルの中にあります。
現在LaravelがサポートしてるデータベースシステムはMySQL、Postgres、SQLite、SQL Serverです。
Read/Write接続
場合により、SELECT文には別のデータベース接続を利用したい場合もあると思います。INSERT、UPDATE、DELETE文では、また他の接続に切り替えたい場合です。Laravelではこれは簡単に実現できます。SQLをそのまま使う場合であろうと、クエリービルダーやEloquent ORMを利用する場合であろうと、適切な接続が利用されます。
Read/Write接続を理解してもらうため、以下の例をご覧ください。
'mysql' => array(
'read' => array(
'host' => '192.168.1.1',
),
'write' => array(
'host' => '196.168.1.2'
),
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
設定配列にread
とwrite
、2つのキーが追加されたことに注目して下さい。2つのキーともhost
というキーを一つ持っています。read
とwrite
接続時の残りのデータベースオプションは、メインのmysql
配列からマージされます。ですから、read
とwrite
の配列には、メインの配列の値をオーバーライドしたいものだけ指定してください。この場合、192.168.1.1
は"read"接続に利用され、一方192.168.1.2
が"write"接続に利用されます。メインのmysql
配列に含まれる、データベース接続情報、プレフィックス、キャラクターセットなどその他のオプションは、両方の接続で共有されます。
クエリーの実行
一度データベース接続の設定を済ませれば、DB
クラスを使用しクエリーを実行できます。
SELECTクエリーを実行する
$results = DB::select('select * from users where id = ?', array(1));
select
メソッドはいつも結果を配列でリターンします。
INSERT文を実行する
DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));
UPDATE文を実行する
DB::update('update users set votes = 100 where name = ?', array('John'));
DELETE文を実行する
DB::delete('delete from users');
注目:
update
とdelete
文はその操作により影響を受けるレコード数をリターンします。
通常のSQL文を実行する
DB::statement('drop table users');
クエリーイベントをリッスンする
DB::listen
メソッドを使用し、クエリーイベントをリッスンすることが可能です。
DB::listen(function($sql, $bindings, $time)
{
//
});
データベーストランザクション
データベーストランザクションを使用して一連の操作を実行する場合は、transaction
メソッドを使ってください。
DB::transaction(function()
{
DB::table('users')->update(array('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');
クエリーのログ
デフォルトでLaravelは現在のリクエストで実行された全クエリーのログをメモリー上に保存しています。しかし、大量の行を挿入するような状況では、アプリケーションがメモリを使いすぎるでしょう。ログを止めるには、disableQueryLog
メソッドを使用してください。
DB::connection()->disableQueryLog();
実行済みのクエリーの配列を取得するために、getQueryLog
メソッドが使用できます。
$queries = DB::getQueryLog();