設定
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' => '',
],
設定配列に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 = ?', [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');
注目:
update
とdelete
文はその操作により影響を受けるレコード数をリターンします。
通常の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();