[FuelPHP]DB::query()を使って、SQL直書きでDBアクセスしたい

FuelPHPでDBをアクセスしたい場合、FuelPHP標準でO/Rマッパや、Model_Crud、クエリビルダー、DB::query()メソッドなど、様々なアクセス方法が用意されています。

簡単なプログラムを作る場合は、O/Rマッパ(ORMパッケージ)などを使ってもよいのですが、データのアクセスが多くなることが予測される場合、DBアクセスが抽象化された形での処理はパフォーマンスが低下する問題が後々出てきてしまいます。

このようなリスクがある場合、SQLを直接かけるDB::query()メソッドを使用すると、抽象化によるオーバーヘッドもないし、DBサーバの実行計画を見ながら詳細なクエリのチューニングが行えます。(一方で、もちろん、最初にシステム構築する際の開発コストが増えますが…)


今回は、DB::query()メソッドを使用したDBアクセスのサンプルを説明します。

DBへの接続定義

プログラム作成に先立ち、DBへの接続定義が必要です。
開発環境の場合は、fuel/app/config/development/db.phpを編集します。

仮に、ID/PASSがuser001/passで、データベース”TEST”に接続したい場合は、下記のような定義になります

<?php
/**
 * The development database settings. These get merged with the global settings.
 */
 
return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=TEST',
            'username'   => 'user001',
            'password'   => 'pass',
        ),
    ),
);






DBクラスを使って検索を行う


最低限の検索処理は以下のような形になります

$sql = 'SELECT * FROM items WHERE id >= :min_id ORDER BY id';
$query = \DB::query($sql);
$query->parameters( array('min_id'=>10 ) );
 
$itemList = $query->execute()->as_array();
var_dump( $itemList );



DBクラスを使用する場合、データは配列として一度に取得されます。
ですので、結果が多くなる場合(10万行など)は、メモリ不足になってしまいます。
このような場合、他のフレームワークが用意しているDBアクセスクラスだとfetch()といったメソッドで、カーソルから1行づつ取得できたりしますが、FuelPHPの場合はカーソルを使用したデータアクセスはありません。





DBクラスを使って更新を行う


こちらはデータの追加・更新・削除する場合のサンプルです。
基本的にselectと同じですが、返される結果セットがないためas_array()は不要です。

$sql = 'UPDATE items SET name = :name WHERE id = :id';
$query = \DB::query($sql);
$query->parameters( array('name'=>'taro', 'id'=>1 ) );
 
$itemList = $query->execute();




関連記事

コメントを残す

メールアドレスが公開されることはありません。