第5弾/金魚屋DBTable 拡張Mambot

 金魚屋開発支援シリーズ第5弾。

 手抜き屋のためのmosDBTable 拡張 Mambot。

 機能を強化。

はじめに

  • 以下あらゆる著作物の利用に関して著作者は一切の責任を負いません。
  • 以下あらゆる著作物の著作権は金魚屋ですが、とりたてて利用に制限はありません。
  • 利用にはHTML とPHP について多少の知識が必要です。
  • ツッコミ大歓迎。
  • 細かいところは解説しません。
  • 設定とか間違えるとエラー吐きます。

NAME

KingyoyaDBTable - 金魚屋 DBTable 拡張Mambot

HISTORY

2008-08-26 Version 1.1.0
  • find() でクエリ結果リソースを直接扱うことにより処理を高速化。
  • メソッド findBy() 追加
  • メソッド makeFindQuery() 追加
  • メソッド execFindQuery() 追加
  • メソッド load() でクエリ結果リソースを利用できるよう修正。
2008-04-11 Version 1.0.1

 factory() がおかしかったので修正。

2008-04-11 Version 1.0.0

 公開

動作環境

  • Joomla 1.0.x

目的

  • なんかもー色々めんどくさくなったので、mosDBTable を拡張しちまえってことです。
  • 単純なクエリで複数レコードを取得できるよう拡張
  • JOIN ムリ。Joomla! ですから。
  • com_kingyoya_mosabstract とcom_kingyoyoa_dbtable で提供していたクラスをmosKingyoyaDBTable に統合してmambot で提供。
  • ついでにいくつか便利そうな関数を追加。

NOTICE

  • 引数間違えたり値とり損ねたりするとE_USER_WARNING にエラー吐きます。

Mambot Name

KingyoyaDBTable

Mambot Group

Kingyoya

USAGE

// mambot 呼び出し
$_MAMBOT->loadBotGroup('Kingyoya');

/**
 * 通常と同様にクラス定義
 */
class mosMyTable extends mosKingyoyaDBTable {

	var $key1;
	var $key2;
	var $key3;

	/**
	 * コンストラクタ
	 * key は自動的に id になる。
	 */
	function mosMyTable(&$db) {
		parent::mosKingyoyaDBTable('#__my_table', $db);
	}

}

global $database;
$row = new mosMyComponent($database);
$row->key1 = 'hoge';
$row->key2 = 'fuga';
$row->key3 = 'piyo';
$result = $row->store();
if (!$result) {
	// error
}
echo "ID: ", $row->id;
echo "Created: ", $row->created('Y-m-d H:i:s');
//$created = $row->created(); // int timestamp
//echo "Created: ", date('Y-m-d H:i:s', $created), "\n";
echo "Created by ", $row->created_by('name');
//$created_by = $row->created_by(); // object mosUser
//echo "Created by {$created_by->name}\n";

$result = $row->load($id);
// $result = $row->loadBy('key1', 'hoge'); // key1 の値が'hoge' のデータを読み込む
if (!$result) {
	// error
}
$row->key1 = 'hoge';
$row->key2 = 'fuga';
$row->key3 = 'piyo';
$result = $row->store();
if (!$result) {
	// error
}
echo "Modified: ", $row->modified('Y-m-d H:i:s');
//$modified = $row->modified(); // int timestamp
//echo "Modified: ", date('Y-m-d H:i:s', $modified), "\n";
echo "Modified by ", $row->modified_by('name');
//$modified_by = $row->modified_by(); // object mosUser
//echo "Modified by {$modified_by->name}\n";

/*
 * リストデータを取得
 */
$row = nwe mosMyTable($database);
$row->key2 = 'value2'; // 検索条件。key2 の値が 'value2' のデータを対象
$row->appendOrderBy('key1', false); // key1 で降順に並び替え
$row->appendOrderBy('id'); // key1 の後に id で昇順に並び替え
$result = $row->find(); // テーブルからデータを検索
// $result = $row->findBy('key3', 'value3'); // キー指定で検索
if (!$result) { // 検索でエラー
	$errorMessage = $row->getError();
	die($errorMessage);
}
while ($row->hasNext()) { // 結果をひとつずつ取得
	$result = $row->next();
	if (!$result) { // 取得に失敗
		$errorMessage = $row->getError();
		die($errorMessage);
	}
	$id = $result->id; // 連番のキー
	$key1 = $result->key1;
	$key2 = $result->key2;
	$key3 = $result->key3;
	$created = $result->created('Y-m-d H:i:s');
	$created_by = $result->created_by('name');
	$modified = $result->created_by('Y-m-d H:i:s');
	$modified_by = $result->modified_by('name');
}

while ($row->next()) { // 結果をひとつずつ取得(簡易版)
}

CLASS mosKingyoyaDBTable 概説

mosKingyoyaDBTable()
mosKingyoyaDBTable(string tablename, database &db)

コンストラク
キーは自動で 'id' に設定される。

load()
boolean load(int id)

id で登録されているデータを読み出して、対応するオブジェクトプロパティに格納する。

boolean load(resource id)

id をクエリ結果リソースとしてデータを取得、対応するオブジェクトプロパティに格納する。

loadBy()
boolean loadBy(string key, string value)

key で指定されたプロパティを元に値を読み出す。

check()
boolean check()

store() のための値検証処理を実装する。

store()
boolean store()

対応するDB テーブルに値を保存する。
mosDBTable のstore() と違い、処理の最初にcheck() を呼び出して検証する。

getError()
string getError()
reset()
void reset()
created()
int created()

登録日時をタイムスタンプで返す。

string created(string date_format)

登録日時をdate_format でフォーマットした文字列を返す。

created_by()
mosUser created_by()

登録ユーザ情報を返す。

mixed created_by(string key)

登録ユーザ情報からkey の値を返す。

modified()
int modified()

更新日時をタイムスタンプで返す。

string modified(string date_format)

更新日時をdate_format でフォーマットした文字列を返す。

modified_by()
mosUser modified_by()

更新ユーザ情報を返す。

mixed modified_by(string key)

更新ユーザ情報からkey の値を返す。

find()
boolean find([ int offset [ , int limit ] ])

テーブルのレコードを検索して複数データを取得する。
カラムと連動したプロパティに設定されている値は、そのまま一致の検索条件に利用される。

findBy()
boolean findBy(string name, string value, [ int offset [ , int limit ] ])

カラム name の値が value であるレコードを検索して複数データを取得する。

appendWhere()
boolean appendWhere(string where)

find() のために自前の検索条件を追加する。
プロパティに値があったり複数の検索条件が設定されていれば、それらはすべて AND でつなげてクエリが作成される。

$rows->appendWhere('created <= UNIX_TIMESTAMP()');
$rows->appendWhere('modified >= UNIX_TIMESTAMP()');

上記で下記のSQL

WHERE created <= UNIX_TIMESTAMP()
	AND modified >= UNIX_TIMESTAMP()
appendWhereLike()
boolean appendWhere(string key, string value)

appendWhere() でLIKE 条件を追加する代替。

appendWhereLike('key1', '%VALUE%')

appendWhere("key1 LIKE '%VALUE%')

と同等。

appendOrderBy()
boolean appendOrderBy(string key [, boolean asc = true ])

find() のために並び替え条件を追加する。
asc が真の場合は昇順、偽の場合は降順となる。
複数指定した場合、指定した順がそのまま優先順位となる。

count()
int count()

find() の結果、取得したレコード数を返す。

hasNext()
boolean hasNext()

擬似Iterator
find() の結果、「次の」データが存在するか。

next()
boolean next()

擬似Iterator
find() の結果、「次の」データを読み込み。
読み込んだデータはそのままオブジェクトのプロパティに設定される。

resetList()
void resetList()

擬似Iterator
ポインタを先頭に戻し、次の next() で最初のデータを読み込むようにする。

copy()
object & copy()

オブジェクトのクローンを返す。

makeFindQuery()
string makeFindQuery([ array wheres [ , array orderby ] ])

テーブルのレコードを検索して複数データを取得するクエリを作成する。
wheres はwhere 条件節となる文字列のリスト。AND で接続して利用される。
orderby はORDER BY 節となる文字列のリスト。

execFindQuery()
boolean execFindQuery(string query, int offset, int limit)

query を複数検索クエリとして実行し結果を取得する。
取得した結果はnext() を実行するごとにプロパティに設定される。

static factory()
object factory(database &database, string class)

class のオブジェクトを作成して返す。

object factory(database &database, string class, mixed load_by)

class のオブジェクトを作成して、load_by を引数にload() を呼び出して返す。

mixed factory(database &database, string class, mixed load_by, string get_property)

class のオブジェクトを作成して、load_by を引数にload() を呼び出し、get_property を名前に持つオブジェクトプロパティの値を返す。

FILES

KingyoyaDBTable.xml

 Mambot インストールXML

KingyoyaDBTable.php

 Mambot メインスクリプト