熟练使用Fuelphp操控MongoDB!

使用FuelPHP v1.7.2时,使用MongoDB的LIKE方法进行前向匹配搜索的注意事项。

我试图使用正则表达式进行提取,但是无论如何,FuelPHP的Mongo_Db类的like方法的结果都不正确。
在查看核心源代码时,我发现即使在正则表达式中传递值,like方法内部仍会对元字符进行转义。

暂时用更改core源文件(/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;
}

如果要提取名称字段的值以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,则字符串的末尾会匹配。

然而,这难道不是错误的吗?

广告
将在 10 秒后关闭
bannerAds