PHP Lithium: фильтрация существующего DocumentSet и получение первого соответствия - PullRequest
3 голосов
/ 03 апреля 2012

Я получаю DocumentSet в Lithium из MongoDB, но я не хочу обрабатывать документы сразу.Вместо этого я хотел бы иметь фильтр, который я мог бы просто сказать примерно так:

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

Я уже пытался сделать это таким образом, но он не работал:

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

Даже если я вручную возвращаю true в замыкании, он всегда возвращает пустой DocumentSet.

Просто для большей ясности: я не ищу операцию с базой данных, вместо этого я хочу получить одну из ужесуществующий DocumentSet.Есть ли причудливый способ добиться этого или мне нужно перебрать набор с помощью пользовательской функции?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Это выглядит правильно для меня.Это код точный , который вы используете?
Например, это значение 'bar', которое вы используете для передачи?

1 голос
/ 04 апреля 2012

Я на последней ветке master в 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());
0 голосов
/ 01 мая 2012

Вместо использования find() я просто использовал first() с замыканием. Это работает как ожидалось. К сожалению, это было единственное, что я не пробовал раньше. Извините, что ответил на мой вопрос.

В любом случае, мне все равно было бы интересно получить другой документ Набор .

...