2017-01-07 6 views
2

現在、Mongo DBからフェッチされた各ドキュメントはstdClassオブジェクトに移動します。代わりに自分のカスタムクラスに直接ロードしたいと思います。指定されたクラスにMongoDB Driver Cursorオブジェクトを直接取り込みます

クラス

class TestClass { 
    private $id; 
    private $class; 

    function __construct($id, $name) { 
     $this->id = $id; 
     $this->class = $class; 
    } 
} 

コード

$m = MongoDB\Driver\Manager('mongodb://<user>:<pass>@<host>/<db>'); 
$query = MongoDB\Driver\Query(['name' => 'TestFirst']); 
// I tried adding the following line, but it says that the constructor args are missing. 
// If I omit it, it just adds each cursor object as an instance of stdClass 
$opt = ['cursor' => new TestClass]; 

$results = $m->executeQuery('newDb.testCollection', $query, $opt); 

foreach ($results as $document) { 
    var_dump($document); 
} 

は私が可能達成したい、または私は各stdClassオブジェクトを通過し、TestClassのインスタンスにキャストする必要があります何ですか?

答えて

1

クラス自体は、配列をBSONデータから問題のクラスに変換するためにMongoDB\BSON\UnserializableインターフェイスとbsonUnserialize(array $data)メソッドを実装する必要があります。

class TestClass implements MongoDB\BSON\Unserializable, MongoDB\BSON\Serializable { 
    private $id; 
    private $name; 

    function __construct ($id, $name) { 
     $this->id = $id; 
     $this->name = $name; 
    } 

    function bsonUnserialize(array $data) { 
     // This will be called *instead* of the constructor if unserializing 
     $this->id = $data['_id']; 
     $this->id = $data['name']; 
    } 
} 

クエリから返されるMongoDB\Driver\Cursorの型マップは、カスタムクラスのインスタンスにドキュメントをマッピングするように設定する必要があります。完成したコードは次のようになります。

$mongo = new MongoDB\Driver\Manager($constr); 
$query = MongoDB\Driver\Query(['name' => 'TestFirst']); 
$cursor = $mongo->executeQuery($query); 
$cursor->setTypeMap('root' => 'array', 'document' => 'TestClass', 'array' => 'array'); 

foreach ($cursor as $doc) { 
    var_dump($doc); 
} 
関連する問題