導入

導入 --  データベースのデータを簡単に取得・変更するためのオブジェクト指向インターフェイス

MDB_QueryTool Description

このパッケージは、SQL クエリ言語をオブジェクト指向で抽象化したものです。 setWhere()setOrder()setGroup()setJoin() などのメソッドを提供することで、簡単にクエリを作成できるようにしています。 また、HTML フォームと連携するために、習得しやすいインターフェイスを提供しています。 これはカラムのデータを配列形式で格納したもので、更新や追加はデータベースで行います。 このパッケージは SQL-Builder をもとにしており、 SQL 文の作成や実行が簡単にできるようになります。 MDB および MDB2 がサポートするすべてのデータベースエンジンで利用できます。

これは DB_QueryTool をそのまま移植したものなので、 同じ API が使用できます。違うのはクラス名だけです (当然、コンストラクタの名前も違います)。 残念ながら、完全なドキュメントはまだ用意できていません。

例 1 - 配列

MDB_QueryTool の利用法としてお勧めなのは、 それを継承したクラスを作成することです。以下に例を示します。
require_once 'MDB/QueryTool.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';

/**
 * "car" テーブルに、以下のフィールドがあるものとします
 * (id, model, hp, color, clima, price)
 */
class Car extends MDB_QueryTool
{
    var $table        = TABLE_CARS;
    var $sequenceName = TABLE_CARS;

    // デフォルトでこうなりますが、一応書いておきます……
    var $primaryCol =   'id';

    /**
     * ここでは、テーブル名に対応する短縮名を割り当てています。
     * これは、テーブル名が変わった際などの対策として必要です。
     * たとえば、プロバイダの db にアプリケーションを配置する際などに
     * 各テーブル名に強制的にプレフィックスをつけられてしまうことがあるかも
     * しれません。そんな場合でも、あなたのアプリケーション内で
     * テーブルの結合条件を指定している部分などを書き換える必要はありません。
     * 実際のテーブル名のかわりに、ここで指定した短縮名が用いられるからです。
     */
    var $tableSpec = array(
        array('name'  => TABLE_CARS, 'shortName' =>  'cars'),
        //array('name'  => TABLE_TIME, 'shortName' =>  'time'),
    );
}


// Car クラスのインスタンスを作成します
$car = new Car($dsn);

// 3 番の車を取得します
$car->reset();     // クエリビルダをリセットします。where 条件や order
                   // などが初期化されます
$res = $car->get(3);
var_dump($res);

// すべての車を取得します
$car->reset();     // クエリビルダをリセットします。where 条件や order
                   // などが初期化されます
$res = $car->getAll();
var_dump($res);

// 最初の 10 台の車を取得します
$car->reset();     // クエリビルダをリセットします。where 条件や order
                   // などが初期化されます
$res = $car->getAll(0, 10);
var_dump($res);

// 色が赤で、快適な車をすべて取得し、価格順に並べます
$car->reset();
$car->setWhere('color="red"');
$car->addWhere('clima=1');
$car->setOrder('price');
$res = $car->getAll();
var_dump($res);

// 新しい車をデータベースに追加します
$data = array(
    'model' => 'Super Trooper',
    'hp'    => 140,
    'color' => 'black',
    'clima' => 0,
    'price' => 19000
);
$newCarId = $car->save($data);
var_dump($newCarId);

// 既存の車の情報を更新します
$data = array(
    'id'    => $newCarId,
    'clima' => 1,
    'price' => 20000,
);
$res = $car->save($data);   // $car->update($data); と同じです
var_dump($res);


// データベースから車を削除します
$res = $car->remove($newCarId);
var_dump($res);

例 2 - クラス

MDB_QueryTool は、クラスに対して使用することもできます。 使用例は、このようになります。
require_once 'MDB/QueryTool.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';

/**
 * "car" テーブルに、以下のフィールドがあるものとします
 * (id, model, hp, color, clima, price)
 */
class Car extends MDB_QueryTool
{
    var $table        = TABLE_CARS;
    var $sequenceName = TABLE_CARS;

    // デフォルトでこうなりますが、一応書いておきます……
    var $primaryCol =   'id';

    /**
     * ここでは、テーブル名に対応する短縮名を割り当てています。
     * これは、テーブル名が変わった際などの対策として必要です。
     * たとえば、プロバイダの db にアプリケーションを配置する際などに
     * 各テーブル名に強制的にプレフィックスをつけられてしまうことがあるかも
     * しれません。そんな場合でも、あなたのアプリケーション内で
     * テーブルの結合条件を指定している部分などを書き換える必要はありません。
     * 実際のテーブル名のかわりに、ここで指定した短縮名が用いられるからです。
     */
    var $tableSpec = array(
        array('name'  => TABLE_CARS, 'shortName' =>  'cars'),
        //array('name'  => TABLE_TIME, 'shortName' =>  'time'),
    );
}


// Car クラスのインスタンスを作成します
$car = new Car($dsn);
$car->useResult('object');

// 3 番の車を取得します
$car->reset();     // クエリビルダをリセットします。where 条件や order
                   // などが初期化されます
$res = $car->get(3)->fetchRow();
var_dump($res);

// すべての車を取得します
$car->reset();     // クエリビルダをリセットします。where 条件や order
                   // などが初期化されます
$cars = $car->getAll();
while ($res = $cars->getNext()) {
    var_dump($res);
}

// 最初の 10 台の車を取得します
$car->reset();     // クエリビルダをリセットします。where 条件や order
                   // などが初期化されます
$cars = $car->getAll(0, 10);
while ($res = $cars->getNext()) {
    var_dump($res);
}

// 色が赤で、快適な車をすべて取得し、価格順に並べます
$car->reset();
$car->setWhere('color="red"');
$car->addWhere('clima=1');
$car->setOrder('price');
$cars = $car->getAll();
while ($res = $cars->getNext()) {
    var_dump($res);
}

// 新しい車をデータベースに追加します
$newCar = $car->newEntity();
$newCar->model = 'Super Trooper';
$newCar->hp    = 140;
$newCar->color = 'black';
$newCar->clima = 0;
$newCar->price = 19000;

$newCarId = $newCar->save();
var_dump($newCarId);

// 既存の車の情報を更新します
$car->reset();
$res        = $car->get($newCarId)->fetchRow();
$res->clima = 1;
$res->price = 20000;
$res->save();
var_dump($res);

// データベースから車を削除します
$car->reset();
$res = $car->get($newCarId)->fetchRow();
var_dump($res->remove());
unset($res);