PHP Lithium:过滤现有的文档集并获得第一个匹配

时间:2012-04-03 00:21:23

标签: php filter find lithium

我正从MongoDB中检索Lithium中的DocumentSet,但我不想一次处理所有文档。相反,我希望有一个过滤器,我可以这样说:

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

我已经尝试过这种方式,但它不起作用:

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

即使我在闭包内手动返回true,它也总是返回一个空的DocumentSet。

只是为了增加清晰度:我不是在寻找数据库操作,而是想从已经存在的DocumentSet中获取一个。是否有一种奇特的方法来实现这一点,还是需要使用自定义函数迭代整个集合?

3 个答案:

答案 0 :(得分:2)

这对我来说是对的。这是您正在使用的完全代码吗?
例如,您正在使用传入的内容的“条形”值是什么?

答案 1 :(得分:1)

我正在使用Lithium的最新分支机构并编写了这个适用于我的单元测试。我不确定你为什么要得到一个空的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());

答案 2 :(得分:0)

我没有使用find()而是使用first()来封闭。这按预期工作。可悲的是,这是我以前唯一没有尝试过的事情。对不起回答我自己的问题。

无论如何,我仍然对获取另一个文档设置的方式感兴趣。