我需要使用“ magic finder” findBy方法并使用比较标准(不仅是精确标准)。换句话说,我需要执行以下操作:
$result = $purchases_repository->findBy(array("prize" => ">200"));
这样我就能获得所有奖金在200以上的商品。
我需要使用“ magic finder” findBy方法并使用比较标准(不仅是精确标准)。换句话说,我需要执行以下操作:
$result = $purchases_repository->findBy(array("prize" => ">200"));
这样我就能获得所有奖金在200以上的商品。
Answers:
这是一个使用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();
}
$this->createQueryBuilder('p')
,而不是绕来绕去,通过EntityManager的:$this->getEntityManager()->createQueryBuilder()
。
该类Doctrine\ORM\EntityRepository
实现Doctrine\Common\Collections\Selectable
API。
该Selectable
界面非常灵活且非常新颖,但是它使您可以轻松地在存储库和单个项目集合上处理比较和更复杂的条件,无论是在ORM还是ODM中还是在完全独立的问题中。
正如您在Doctrine 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
),而专注于编写自己的标准类,每个标准类代表这些特定的过滤器之一。
$criteria::expr()->gt()
理想的,不是吗?
Criteria::expr()
也可以-随时编辑答案。
findOneBySomethingWithParticularRule
IMO拥有像这样的具体存储库方法是一件好事,因为它使您的业务逻辑与Doctrine实现细节(例如标准构建器)脱钩。
您必须使用DQL或QueryBuilder。例如,在你的Purchase- EntityRepository你可以做这样的事情:
$q = $this->createQueryBuilder('p')
->where('p.prize > :purchasePrize')
->setParameter('purchasePrize', 200)
->getQuery();
$q->getResult();
对于更复杂的场景,请查看Expr()类。
$criteria = new \Doctrine\Common\Collections\Criteria();
$criteria->where($criteria->expr()->gt('id', 'id'))
->setMaxResults(1)
->orderBy(array("id" => $criteria::DESC));
$results = $articlesRepo->matching($criteria);
现在,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
我喜欢使用这样的静态方法:
$result = $purchases_repository->matching(
Criteria::create()->where(
Criteria::expr()->gt('prize', 200)
)
);
当然,当条件为1时,您可以推送逻辑,但是当条件更多时,最好将其划分为片段,进行配置并将其传递给方法:
$expr = Criteria::expr();
$criteria = Criteria::create();
$criteria->where($expr->gt('prize', 200));
$criteria->orderBy(['prize' => Criteria::DESC]);
$result = $purchases_repository->matching($criteria);