5
6

More than 5 years have passed since last update.

FuelphpでMongoDBを使いこなす!

Posted at

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なんじゃないのか・・・?

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6