Php 如何使用具有比较标准的findBy方法

Php 如何使用具有比较标准的findBy方法,php,doctrine-orm,Php,Doctrine Orm,我需要使用使用比较标准(而不仅仅是精确标准)的“魔力发现者”方法。换句话说,我需要这样做: $result = $purchases_repository->findBy(array("prize" => ">200")); $q = $this->createQueryBuilder('p') ->where('p.prize > :purchasePrize') ->setParameter('purchas

我需要使用使用比较标准(而不仅仅是精确标准)的“魔力发现者”方法。换句话说,我需要这样做:

$result = $purchases_repository->findBy(array("prize" => ">200"));
$q = $this->createQueryBuilder('p')
          ->where('p.prize > :purchasePrize')
          ->setParameter('purchasePrize', 200)
          ->getQuery();

$q->getResult();
这样我就可以在奖品超过200的地方购买所有物品。

您必须使用或。例如,在您的购买中-您可以这样做:

$result = $purchases_repository->findBy(array("prize" => ">200"));
$q = $this->createQueryBuilder('p')
          ->where('p.prize > :purchasePrize')
          ->setParameter('purchasePrize', 200)
          ->getQuery();

$q->getResult();

对于更复杂的场景,请查看。

这是一个使用-的示例,几天前我也需要它,我花了一些时间来了解确切的语法和使用方式:

/**
 * 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();
}
该类实现了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的主要优势在于,您在这里实现了某种策略模式,它可以与存储库、集合、惰性集合以及实现
selective
API的任何地方一起使用


这样,您就可以摆脱为存储库编写的几十种特殊方法(如
findonebysomethingwithspecificularrrule
),转而专注于编写自己的标准类,每个标准类代表这些特定过滤器中的一个。

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

我喜欢使用这样的静态方法:

$result=$purchases\u repository->匹配(
条件::create()->其中(
标准::expr()->gt('prize',200)
)
);
当然,当逻辑为1个条件时,您可以推送逻辑,但当您有更多条件时,最好将其划分为片段,配置并将其传递给方法:

$expr=Criteria::expr();
$criteria=criteria::create();
$criteria->where($expr->gt('prize',200));
$criteria->orderBy(['prize'=>criteria::DESC]);
$result=$purchases\u repository->匹配($criteria);

避免在没有严格必要的情况下使用DQL。它将您锁定到特定于ORM的API中,并且不是真正可重用的。有些情况下需要DQL,但这不是其中之一。如何使用QueryBuilder不以完全相同的方式将您锁定在原则中?如果不严格需要,请避免使用DQL,这只是使您的逻辑越来越与ORM耦合。@Sliq这是一种条令行为,不一定与symfony有任何关系。@Sliq在尝试更多的框架后,您会意识到symfony并不是那么糟糕。如果我看得没错,这个函数是一个存储库方法。在这里,您可以直接通过EntityManager转到
$this->createQueryBuilder('p')
,而不是四处转转:
$this->getEntityManager()->createQueryBuilder()
。注意:我使用的是symfony 2.8.11和条令,可能就在这里,它是“Criteria::expr()->gt()”,而不是“$Criteria->->()->gt()”.这是一种静态方法:而且:Symfony不是学说。带有条令名称和版本控制的参考条令材料:-P@Ocramius然后它应该是
$criteria::expr()->gt()
理想情况下,没有?
criteria::expr()
也可以-请随意编辑答案。在我看来,拥有具体的存储库方法,如
findonebysomethingwithspecificularrrrule
是一件好事,因为它将您的业务逻辑与条令实施细节(如准则生成器)分离。如果您认为条令或symfony不是您的事,您刚刚为项目选择了一个错误的框架。这些框架在许多项目中都非常有效。为什么它必须如此保密?这对我来说不起作用,请参阅