thinkphp mongo模型的getField()方法的bug
在使用mongo模型的getField()方法获取单个字段的值时,发现无论获取什么字段,始终都只会返回对应_id字段的值,于是跟踪查看mong模型中的getField方法的代码,如下:
if(1==$options['limit']) return reset($result[0]);
此为当获取单个字段,且只获取单条记录时的代码。如果是mysql的话,改代码是没有问题的,但是mongo和mysql查询返回结果有一点区别,无论是查询什么字段,mongo都会默认将_id返回,也就是说,使用reset()后,指针指向的并不是所需的字段,而是_id,因而始终会返回_id的值。
修改起来也很简单,reset($result[0])改为$result[0][$field]就可以了。
当然,如果集合中有多层结构,如需查询info.name,就需要增加判断,具体实现如下:
$value = $result[0];
if(strpos($field, '.')){
$tmp = explode('.', $field);
foreach ($tmp as $t){
$value = $value[$t];
}
}else{
$value = $value[$field];
}
return $value;