如何使用比较准则的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);