2012-04-03 10 views
3

MongoDBからLithiumのDocumentSetを取得していますが、ドキュメントを一度に処理したくありません。私はすでに、このようにそれを実行しようとしましたが、それはうまくいきませんでしたPHP Lithium:既存のDocumentSetをフィルタリングして最初に一致させる

$manyDocuments->giveMeTheOneWhere(array('foo' => 'bar')); 

$manyDocuments->find(function($singleDocument){ 
    return ($singleDocument->foo == 'bar'); 
}); 

場合でも、代わりに私は、私はちょうどこのような何かを伝えることができた、フィルターを持っていると思います私はクロージャ内で手動でtrueを返し、常に空のDocumentSetを返します。

明快さを追加する:データベース操作を探しているのではなく、すでに存在するDocumentSetから1つを取得したいと考えています。これを実現するファンシーな方法はありますか?またはカスタム関数を使用してセットを反復処理する必要はありますか?

答えて

0

の代わりに、私はちょうど閉鎖とfirst()を使用find()を使用。これは期待どおりに動作します。残念ながらそれは私が以前に試していなかった唯一のものでした。私自身の質問に答えるために失礼します。

とにかく私はまだ別のドキュメントを入手する方法に興味がありますを設定してください。

2

そうですね。 正確なコードを使用していますか?
たとえば、渡しているものを使用している 'bar'の値はありますか?

+0

'function($ singleDocument)use($ variableToCompare){'を使って明示的にアナウンスしない限り、変数がクロージャの中で見えないことを私は思い出していたでしょう。 – YMMD

+0

@YMMDそう、私はfindメソッドを使用しようとしたときにこの問題を抱えていました。問題をどのようにトラブルシューティングしていますか?閉鎖の中にブレークポイントを入れて、あなたのfooフィールドを調べてみましたか?データに誤植があり、文字列が完全に一致しない前に問題が発生しました。 –

1

私はリチウムのマスターブランチの最新版で、このユニットテストを書いてくれました。空のDocumentSetを取得している理由がわかりません。

$docs = new DocumentSet(array('data' => array(
    new Document(array('data' => array(
     'id' => 1, 
     'foo' => 'bar' 
    ))), 
    new Document(array('data' => array(
     'id' => 2, 
     'foo' => 'baz' 
    ))), 
    new Document(array('data' => array(
     'id' => 3, 
     'foo' => 'bar' 
    ))), 
    new Document(array('data' => array(
     'id' => 4, 
     'blah' => 'ack' 
    ))) 
))); 
$filtered = $docs->find(function($doc) { 
    return $doc->foo === 'bar'; 
}); 
$expected = array(
    '0' => array('id' => 1, 'foo' => 'bar'), 
    '2' => array('id' => 3, 'foo' => 'bar') 
); 
$this->assertIdentical($expected, $filtered->data()); 
+0

私の悪い...どういうわけか、私は "私はデータベース操作を探していません"というメモを忘れてしまった。 – rmarscher

関連する問題