Как использовать метод findBy со сравнительными критериями
Мне нужно будет использовать метод findBy "magic finder" с использованием сравнительных критериев (а не только точных критериев). Другими словами, Мне нужно сделать что-то вроде этого:
$result = $purchases_repository->findBy(array("prize" => ">200"));
Так что я бы получил все покупки, где приз выше 200.
5 ответов:
Это пример использования Expr () Class - меня это тоже несколько дней назад и мне потребовалось некоторое время, чтобы выяснить, каков точный синтаксис и способ использования:
/** * fetches Products that are more expansive than the given price * * @param int $price * @return array */ public function findProductsExpensiveThan($price) { $em = $this->getEntityManager(); $qb = $em->createQueryBuilder(); $q = $qb->select(array('p')) ->from('YourProductBundle:Product', 'p') ->where( $qb->expr()->gt('p.price', $price) ) ->orderBy('p.price', 'DESC') ->getQuery(); return $q->getResult(); }
класс
Doctrine\ORM\EntityRepositoryосуществляетDoctrine\Common\Collections\SelectableAPI.The
Selectableинтерфейс очень гибкий и довольно новый, но он позволит вам легко обрабатывать сравнения и более сложные критерии как в репозиториях, так и в отдельных коллекциях элементов, независимо от того, есть ли в ORM или ODM или полностью отдельные проблемы.это будет критерием сравнения, как вы только что просили, как в доктрине ORM
2.3.2:$criteria = new \Doctrine\Common\Collections\Criteria(); $criteria->where($criteria->expr()->gt('prize', 200)); $result = $entityRepository->matching($criteria);главные преимущество этого API заключается в том, что вы реализуете здесь какой-то шаблон стратегии, и он работает с репозиториями, коллекциями, ленивыми коллекциями и везде
SelectableAPI реализован.это позволяет вам избавиться от десятков специальных методов, которые вы написали для своих репозиториев (например,
findOneBySomethingWithParticularRule), и вместо того, чтобы сосредоточиться на написании собственных классов критериев, каждый из которых представляет один из этих фильтров.
вы должны использовать либо DQL или QueryBuilder. Например, в вашей покупке -EntityRepository вы могли бы сделать что-то вроде этого:
$q = $this->createQueryBuilder('p') ->where('p.prize > :purchasePrize') ->setParameter('purchasePrize', 200) ->getQuery(); $q->getResult();для еще более сложных сценариев взгляните на Expr () class.
документация Symfony теперь явно показывает, как это сделать:
$em = $this->getDoctrine()->getManager(); $query = $em->createQuery( 'SELECT p FROM AppBundle:Product p WHERE p.price > :price ORDER BY p.price ASC' )->setParameter('price', '19.99'); $products = $query->getResult();от http://symfony.com/doc/2.8/book/doctrine.html#querying-for-objects-with-dql
$criteria = new \Doctrine\Common\Collections\Criteria(); $criteria->where($criteria->expr()->gt('id', 'id')) ->setMaxResults(1) ->orderBy(array("id" => $criteria::DESC)); $results = $articlesRepo->matching($criteria);
Comments