イントロダクション
LaravelはたとえSQLを直接使用する場合でも、FluentクエリービルダーやEloquent ORMを使う時でも、データベースとの接続、クエリーの実行をとても簡単にしてくれます。現在、Laravelは以下のデータベースシステムを使用しています。
- MySQL
- Postgres
- SQLite
- SQL Server
設定
Laravelはデータベースとの接続、クエリーの実行をとても簡単にしてくれます。データベース設定ファイルはconfig/database.php
です。このファイルで使用するデータベース接続を全部定義すると同時に、デフォルトで使用する接続も指定してください。サポートしている全データベースシステムの例がファイルの中に用意しています。
デフォルトでLaravelのサンプル環境設定は、ローカルマシーン上でLaravelでの開発を行うのに便利な仮想マシーンであるLaravel Homestead用に設定してあります。もちろん、ローカルのデータベースに合わせるため、自由に変更してくだい。
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
配列に含まれる、データベース接続情報、プレフィックス、文字セットなどその他のオプションは、両方の接続で共有されます。
SQLクエリーの実行
データベース接続の設定を済ませれば、DB
ファサードを使用しクエリーを実行できます。DB
ファサードは
select
、update
、insert
、delete
、statement
のクエリータイプごとにメソッドを用意しています。
SELECTクエリーの実行
基本的なクエリーを行うには、DB
ファサードのselect
メソッドを使います。
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* アプリケーションユーザー全員のリストを表示
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
select
メソッドの最初の引数はSQLクエリーで、2つ目の引数はクエリーに結合する必要のあるパラメーターです。通常、パラメーターはwhere
節制約の値です。パラメーター結合はSQLインジェクションを防ぐために提供されています。
selectメソッドはいつも結果の「配列」を返します。結果の値へアクセスできるように、配列に含まれる結果はそれぞれ、PHPのStdClass
オブジェクトになります。
foreach ($users as $user) {
echo $user->name;
}
名前付き結合の使用
パラメーター結合に?
を使う代わりに名前付きの結合でクエリーを実行できます。
$results = DB::select('select * from users where id = :id', ['id' => 1]);
INSERT文の実行
insert
文を実行するには、DB
ファサードのinsert
メソッドを使います。このメソッドは第1引数にSQLクエリー、結合を第2引数に取ります。
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
UPDATE文の実行
データベースの既存レコードの更新には、update
メソッドを使います。このメソッドの返却値は影響を受けたレコード数です。
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
DELETE文の実行
データベースからレコードを削除するには、delete
メソッドを使います。update
と同様に、削除したレコード数が返されます。
$deleted = DB::delete('delete from users');
通常のSQL文を実行する
いつくかのデータベース文は値を返しません。こうしたタイプの操作には、DB
ファサードのstatement
メソッドを使います。
DB::statement('drop table users');
クエリーイベントのリッスン
アプリケーションで実行される各SQLクエリーを取得したい場合は、listen
メソッドがし良いうできます。このメソッドはクエリーをログしたり、デバッグしたりするときに便利です。クエリーリスナーはサービスプロバイダーの中で登録します。
<?php
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスの初期処理
*
* @return void
*/
public function boot()
{
DB::listen(function($sql, $bindings, $time) {
//
});
}
/**
* サービスプロバイダーの登録
*
* @return void
*/
public function register()
{
//
}
}
データベーストランザクション
一連の操作をデータベーストランザクション内で実行するには、DB
ファサードのtransaction
メソッドを使用してください。トランザクション「クロージャー」の中で例外が投げられると、トランザクションは自動的にロールバックされます。「クロージャー」が正しく実行されると、自動的にコミットされます。transaction
メソッドを使用すれば、ロールバックやコミットを手動で行う必要はありません。
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
手動トランザクション
トランザクションを自分で開始し、ロールバックとコミットを完全にコントロールしたい場合は、DB
ファサードのbeginTransaction
メソッドを使います。
DB::beginTransaction();
rollBack
メソッドにより、トランザクションをロールバックできます。
DB::rollBack();
同様に、commit
メソッドにより、トランザクションをコミットできます。
DB::commit();
注目:
DB
ファサードのトランザクションメソッドにより、クエリービルダーとEloquent ORMのトランザクションもコントロールできます。
複数接続の使用
複数の接続を使用する場合は、DB
ファサードのconnection
メソッドを利用し、各接続にアクセスできます。connection
メソッドに渡す「名前」は、config/database.php
設定ファイルの中のconnections
にリストされている名前を指定します。
$users = DB::connection('foo')->select(...);
裏で動作しているPDOインスタンスに直接アクセスしたい場合は、接続インスタンスにgetPdo
メソッドを使います。
$pdo = DB::connection()->getPdo();