如何使用比较准则的findBy方法

我需要使用一个“神奇的发现者”findBy方法使用比较标准(不仅确切的标准)。 换句话说,我需要做这样的事情:

$result = $purchases_repository->findBy(array("prize" => ">200")); 

这样我就能得到所有奖品在200以上的购物。

这是一个使用Expr()类的例子 – 前几天我也需要这个,我花了一些时间来找出确切的语法和用法:

 /** * 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\Selectable API。

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的主要优点是你在这里实现了某种策略模式,它可以处理存储库,集合,懒惰集合以及实现Selectable API的所有地方。

这可以让你摆脱几十个为你的仓库编写的特殊方法(比如findOneBySomethingWithParticularRule ),而是专注于编写你自己的标准类,每个类代表这些特定的filter之一。

您必须使用DQL或QueryBuilder 。 例如,在您的Purchase- EntityRepository中,您可以这样做:

 $q = $this->createQueryBuilder('p') ->where('p.prize > :purchasePrize') ->setParameter('purchasePrize', 200) ->getQuery(); $q->getResult(); 

对于更复杂的场景,请查看Expr()类 。

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);