Как узнать, не было ли найдено ни одного результата, используя критерии доктрины?

У меня есть несколько сообщений в блогах в моей базе данных, и я использую критерии доктрины для их фильтрации. Если я пишу критерии, которые соответствуют некоторым сообщениям, все работает идеально.

Представьте, что есть 3 пользователя (Пользователь 1, Пользователь 2, Пользователь 3) и есть несколько сообщений, помеченных как личные от Пользователя 1 и пользователя 2.

Это мой php-код:

$criteria = Criteria::create();
$criteria->Where($criteria->expr()->eq('private', 1);
$criteria->andWhere($criteria->expr()->eq('author', $author));
$posts=$service->findPostBy($criteria);

return array(
            'page' => $page,
            'posts'=>$posts,
            'filter' => $form->createView()
            );

/*findPostBy calls Doctrine matching function*/
public function matching(Criteria $criteria)
    {
        $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);

        return new ArrayCollection($persister->loadCriteria($criteria));
    }

Если я запрашиваю личные сообщения пользователя 1, он создает функциональный запрос и возвращает сообщения, которые я хочу. Но если я попрошу личные сообщения пользователя 3, он вернет все сообщения в моей базе данных без какой-либо фильтрации. Как я могу узнать, работают ли мои критерии, если они не возвращают пустой результат в случае отсутствия совпадений.


person kajacx    schedule 02.01.2015    source источник
comment
Профилировщик Symfony должен показать вам точные запросы к базе данных, которые выполняются, и вы можете проверить их там.   -  person Jason Roman    schedule 02.01.2015
comment
Это правда, но мне нужно сообщить пользователю, что нет сообщений, основанных на его фильтрах. Мне нужна какая-то переменная или что-то, что позволило бы мне сообщить пользователю.   -  person kajacx    schedule 02.01.2015
comment
Разве это не было бы просто проверкой, когда запрос возвращает 0 результатов?   -  person Jason Roman    schedule 02.01.2015
comment
Дело в том, что он не возвращает 0 результатов. Возвращает все, что неважно фильтрует.   -  person kajacx    schedule 02.01.2015
comment
Отсюда мое первое предложение использовать профилировщик Symfony, чтобы убедиться, что ваши критерии действительно устанавливаются в запросах.   -  person Jason Roman    schedule 03.01.2015
comment
Кажется, что нет, оператор «где» в sql-запросе пуст. Что это значит для меня?   -  person kajacx    schedule 03.01.2015
comment
Я бы опубликовал больше кода, показывающего, где вы создаете запрос и применяете к нему критерии.   -  person Jason Roman    schedule 03.01.2015


Ответы (1)


Попробуй это:

$criteria = Criteria::create()
    ->where(Criteria::expr()->eq('private', 1);
    ->andWhere(Criteria::expr()->eq('author', $author));

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

$posts $service->findPostBy(array('private' => 1, 'author' => $author);
person Jason Roman    schedule 02.01.2015
comment
Как я могу моделировать операторы › и ‹ в этой нотации массива? - person kajacx; 03.01.2015
comment
Если вы имеете в виду больше или меньше, вам придется использовать построитель запросов или DQL для таких случаев. См. doctrine-orm.readthedocs.org/en /последняя/ссылка/ - person Jason Roman; 03.01.2015
comment
Ты в конце концов понял это @kajacx? - person Jason Roman; 05.01.2015