FuelPHP v1.7.2から、MongoDBのLIKEメソッドを利用して、前方一致検索を使用する場合の注意点。
正規表現を使って抽出しようとしたが、どうしてもFuelPHPのMongo_Dbクラスのlikeメソッドでは結果が正しくない。
coreのソースを確認して見ると、正規表現で値を渡しても、likeメソッド内部でメタ文字がクォートされてました。
coreのソース(/core/classes/mongo/db.php)をゴニョゴニョ変更して対応。
(他にもっといい方法があるかもしれないが、とりあえずこれで対応)
以下、変更箇所。
/core/classes/mongo/db.php
public function like($field = '', $value = '', $flags = 'i', $disable_start_wildcard = false, $disable_end_wildcard = false)
{
$field = (string) trim($field);
$this->_where_init($field);
$value = (string) trim($value);
//$value = quotemeta($value);//この行をコメントアウト
(bool) $disable_start_wildcard === false and $value = '^'.$value;
(bool) $disable_end_wildcard === false and $value .= '$';
$regex = "/$value/$flags";
$this->wheres[$field] = new \MongoRegex($regex);
return $this;
}
<例>
nameフィールドの値が、abcのいずれかで始まるドキュメントを抽出する場合
// インスタンスを取得
$mongodb = \Mongo_Db::instance();
$mongodb->like('name', '[a|b|c]', 'im', false, true);
$users = $mongodb->get('users');
ちなみに、日本語ドキュメントも
$enable_start_wildcard true がセットされた場合、文字列の先頭がマッチする。
$enable_end_wildcard true がセットされた場合、文字列の後尾がマッチする。
と、なっているがfalseなんじゃないのか・・・?