mongodb返回对象和数组分开

时间:2014-09-06 04:48:55

标签: php mongodb return phalcon

我使用phalcon框架和mongo db。 我向您展示了两种不同的方式。首先返回不正确的结果,但第二种方式返回正确的结果(他使用默认的php扩展名)。

为什么我会得到不同的结果?怎么解析呢?

phalcon中的样本(方式1):

    $documents = new AdminModel();
    $cursor = $documents->find(array(
        'login' => 'hello'
    ));

    echo "<pre>";
    foreach($cursor as $doc){
        foreach($doc as $prop){
            var_dump($prop);
        }
    }
    echo "</pre>";

如何查看AdminModel(方式1):

    class AdminModel extends \Phalcon\Mvc\Collection{

        public function getSource()
        {
            return "accounts";
        }
    }

结果(方式1):

    object(MongoId)#70 (1) {
      ["$id"]=>
      string(24) "540822d55d34c4087a320064"
    }

    array(3) {
      ["login"]=>
      string(3) "one"
      ["password"]=>
      string(60) "$2y$10$RB2PvyRWxD7kdZcYpb8BGO6E/2ftbAEwnJ/28TBWUaDmX.iesPqY2"
      ["role"]=>
      string(4) "user"
    }

当我尝试使用默认扩展名(方式2)时:

    $mongo = new \MongoClient();
    $db = $mongo->weather;
    $collection = $db->accounts;

    $cursor = $collection->find();

    echo "<pre>";
    foreach($cursor as $doc){
            var_dump($doc);echo "1<br/>";
    }
    echo "</pre>";

结果(方式2):

    array(2) {
      ["_id"]=>
      object(MongoId)#72 (1) {
        ["$id"]=>
        string(24) "540822d55d34c4087a320064"
      }
      ["user"]=>
      array(3) {
        ["login"]=>
        string(3) "one"
        ["password"]=>
        string(60) "$2y$10$RB2PvyRWxD7kdZcYpb8BGO6E/2ftbAEwnJ/28TBWUaDmX.iesPqY2"
        ["role"]=>
        string(4) "user"
      }
    }

更新:

        foreach($cursor as $model){
            echo $model->user['login']."<br/>";
            echo $model->user['password']."<br/>";
            echo $model->user['role']."<br/>";
        }

2个
$ 2Y $ 10 $ RB2PvyRWxD7kdZcYpb8BGO6E / 2ftbAEwnJ / 28TBWUaDmX.iesPqY2
管理员
3个
$ 2Y $ 10 $ RB2PvyRWxD7kdZcYpb8BGO6E / 2ftbAEwnJ / 28TBWUaDmX.iesPqY2
客人

注意:未定义的属性:第19行的/Users/rd/sites/app/controllers/Admin/IndexController.php中的Weather \ Model \ AdminModel :: $ user

注意:第20行的/Users/rd/sites/app/controllers/Admin/IndexController.php中未定义的属性:Weather \ Model \ AdminModel :: $ user

注意:未定义的属性:第21行的/Users/rd/sites/app/controllers/Admin/IndexController.php中的Weather \ Model \ AdminModel :: $ user

我告诉了,什么找到返回1个对象和1个数组。我们看到,$ model尝试访问:

    object(MongoId)#70 (1) {
      ["$id"]=>
      string(24) "540822d55d34c4087a320064"
    }

然后我们得到通知。

1 个答案:

答案 0 :(得分:0)

你是什么意思???你使用两个完全不同的东西,因此你得到两个完全不同的结果。 Mongo客户端按原样返回您的JSON文档。 Phalcon使用Mongo客户端(可能不是同一个)来检索这些文档并将它们映射到您的模型以便更方便地使用。因此,AdminModel::find在内部调用Collection::find,然后将结果存储为自己的格式,在转储var时会看到。

请参阅ODM (Object-Document Mapper) documentation,它详细介绍了实施以及如何使用它。

修改

你真的不需要解析它,因为模型应该为你做这个。要访问您的数据,您可以执行以下操作。

$documents = new AdminModel();
$cursor = $documents->find(array(
    'login' => 'hello'
));

foreach($cursor as $model){
    var_dump($model->user);
    echo $model->user['login'];
    echo $model->user['password'];
    echo $model->user['role'];
}

$model = $documents->findFirst(array(
    'login' => 'hello'
));
var_dump($model->user);
echo $model->user['login'];
echo $model->user['password'];
echo $model->user['role'];

PS:你在第一个例子中也有一个嵌套循环,否则(我假设)它会显示一个具有iduser属性的对象。