熟练使用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,则字符串的末尾会匹配。
然而,这难道不是错误的吗?