404 motivation not found | t_ishidaのブログ

2月/09

10

フレームワーク(笑) – その3 – ORマッパ(笑)

概要

ORマッパ(笑)とはフレームワーク(笑)のMVC(笑)のモデル(笑)の部分を受け持つ仕組みです。実に低機能なORマッパっぽいものです。

<?php
require_once 'define.php';
require_once 'drivers/DBDriver.php';
require_once 'EntityBase.php';
class or_mapper extends EntityBase {
	protected $TableName = __CLASS__;
	public function __construct(){
		parent::__construct(
			// データストアにするデータドライバー
			new DBDriver( DSN ), 

			// エラーが有ったら例外投げるか?(極力trueで)
			true
			);
	}
}

$x = new or_mapper();
$x->search( 10 );
$x->fld1 = 'fld1';
$x->fld2 = 'fld2';
$x->fld3 = 'fld3';
$x->save();

特徴

低機能な割にDBの設計に縛りを入れます。縛りは「主キーは必ず数値型でidと言う名前のフィールドでなければならない」と言うものです。

作り方

EntityBaseと言う抽象クラスを継承して作成します。コードのイメージは概要部のコード参照

ちょっとした説明

大雑把でやる気の無いクラス図で言うとこんな構造です。
x

実際にはデータカタログは単なるハッシュですが、簡単のために、クラスとして書いてます。DataDriverBaseのインターフェースを守っていればDBじゃなくてもORマッパ(笑)は、データストアは選びません。例えば固定長ファイルならば、項目別の値の長さの定義をどこかに定義(カタログ)しておきDataDriverBaseを継承したTextFileDriverが項目をsplitして返すような仕組みを作れば、使用するDriverを変えるだけDBだろうと固定長ファイルだろうと同じように動作するソフトウェアが書けるかも知れません。(あくまで理想論)

ただし、作者のやる気が足りないため、現状ではDBDriverしか作成していません。多分、今後もDB以外を作る事はないんじゃないかと思います。

使い方
主に使うのは二つのメソッドです。

search

検索します。

第一引数 – 検索条件

///
/// IDをそのまま引数として渡すと検索します(基本です)
///
$obj->search( 1 );

// 一件検索ならば自身がfillされます
print $obj->name;

/****************************
 * DB用Driverの勝手な拡張
 ****************************/
///
/// 検索条件の指定
///
foreach(
	$obj->search(
		array(
			'fld1' => 'filter1' ,
			'fld2' => 'filter2' ,
			'fld3' => 'filter3' ,
			'fld4' => 'filter4' ,
			)) as $row ) {

	// 指定した条件のand検索します
            // 複数行の選択が行われた場合には戻り値に配列で返ってきます
            // 自身は、先頭行の値でfillされます。
	print $row->name . "\n";
}

///
/// 検索条件の指定2
///
foreach(
	$obj->search(
		array(
			'fld1' => array( 1, 2, 3, 4, 5 )
			)) as $row ) {

	// 指定フィールドをin検索します
	print $row->name . "\n";
}

///
/// 検索条件の指定3
///
foreach(
	$obj->search(
		array(
			':sql' => array(
					"   fld1 = '?param1?'" ,
					"or fld2 = '?param2?'" ,
					),
			':params' => array(
				"param1" => 'parameter1' ,
				"param2" => 'parameter2' ,
				),
			))) as $row ) {

	// 指定されたWhere句で検索します
	//  SQL文本体は行を1要素としたarrayで指定。
            //  paramsは、パラメータ名とvalueのハッシュで指定
	print $row->name . "\n";
}

第二引数 – ページャー

array(
	'count' => '10',  // 一度に取得する件数
	'page'  => '2'    // 対象のページ
);

第三引数 – ソート指定

array(
  'name'      => 'ソート対象フィールド',  // ソート対象のフィールド
  'direction' => '(?:desc|asc)'           // ソート方向
);

save

保存します

単に、代入されている値で保存します
idが無ければ、新たにidを取得してinsert,
idがあれば、対象のidにupdateを試みます。

SQLEditor

概要

SQL文を読みやすく記述する為の支援クラスです。
SQL文中「?param_name?」で指定するとパラメータ置換が行われます。

$sql = new SQLEditor();

$sql->add( "select" );
$sql->add( " * " );
$sql->add( "from" );
$sql->add( "  tbl1" );
$sql->add( "where" );
$sql->add( "  ( 1 = 1 )" );
$sql->add( "and fld1 = '?param1?'");
$sql->add( "and fld2 = '?param2?'");
$sql->add( "and fld3 = '?param3?'");

$sql->setParam( 'param1', $param1 );
$sql->setParam( 'param2', $param2 );
$sql->setParam( 'param3', $param3 );

print $sql->toSQL();

1、置換されないパラメータの残っている行は行ごと削除されます
=> 検索条件を指定するような一覧の時とかに使用するとif文の嵐になりにくくなります。

2、パラメータのシングルクォートを自動で「”」に置換します
=> ORマッパ(笑)と違って、カラム型とかを考慮している訳ではないので、
シングルクォートしか対策は行っていません。
ユーザー入力の数値型とかを素通りさせないように注意して下さい。

3、行頭の連続スペースを削除して、行末にスペースを加えます。
=> スペースの入れ忘れのエラーとか防げます

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 統計学入門読みながらつけてるメモ – その1

フレームワーク(笑) – その2 – Actionクラス >>

Find it!

Theme Design by devolux.org

Tag Cloud