CakePHP 1.3.6 での話です。
これ、やったのはずいぶんと前なんですが書いてなかったですね。
私はすごくうれしかったのですが、周りの反応は薄かった覚えがあります。
CakePHP 1.3 でSQLite3ってのはかなりイレギュラーで、確か、CakePHPのTracから探してきたドライバ(dbo_sqlite3.php)を使用しています。
確認しようと思ったのですがTracに繋がらないぞ?ってな状況。
そんなこんなでとてもマイナーな話なんですよね。 反応が薄いのもむべなるかな。
ですが、PDOでSQLiteにアクセスしている場合なら応用が効くかと思います。
dbo_sqlite3.php 内部でPDOが使用されておりますので。
app_model.php でやっているので関係するところをまとめて引用。
class AppModel extends Model {
function beforeFind($queryData) {
parent::beforeFind($queryData);
//正規表現関数有効化
$this->regxEnable();
}
/**
* 正規表現関数有効化
*/
public function regxEnable(){
$db =& $this->getDataSource();
$db->connection->sqliteCreateFunction('RGX', array('AppModel', 'sqliteRegexMatch'), 2);
}
/**
* 正規表現関数
*/
public function sqliteRegexMatch($regex, $str) {
if(empty($regex)){
return true;
}else{
return preg_match($regex, $str);
}
}
}
$db->connection がPDOのインスタンスです。
sqliteRegexMatch で $regex が empty の場合に true を返しているのは実装しているアプリケーションの都合ですのでご注意を。
実装の際、下記サイトを参考にさせていただきました。
違いはPDOであること、preg_matchを使用していること、SQL関数を処理するコールバック関数としてメソッドを使っていることです。
CakePHP的ポイント
PDO_SQLITE的ポイント
使い方ですが、参考サイトと違ってpreg_matchでの正規表現であることに注意してくださいね。
私の場合、CakePHPでの使用ですので
/**
* モデルのconditonsに正規表現を使う場合の配列を返す。
*
* @param $pattern 正規表現
* @param $cols 判定対象のカラムの配列
* @return
*/
function whereByRgx($pattern, $cols) {
$conditons = array();
if(!empty($pattern)){
foreach ($cols as $colname) {
$conditons[] = "RGX('" . $pattern . "', " . $colname . ")";
}
}
return $conditons;
}
てなモデルでのfindなどで使用するconditions用の配列を返すメソッドを作って使っております。
タグ: CakePHP