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

时间:2013-02-09 10:01:49

标签: php symfony doctrine-orm

我需要使用比较标准的“魔术探测器”findBy方法(不仅仅是准确的标准)。换句话说,我需要做这样的事情:

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

这样我就可以获得奖金高于200的所有购买。

6 个答案:

答案 0 :(得分:176)

班级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),而是专注于编写自己的条件类,每个类都代表一个特定的过滤器。

答案 1 :(得分:29)

这是一个使用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();
}

答案 2 :(得分:6)

您必须使用DQLQueryBuilder。例如。在您的购买 - EntityRepository中,您可以执行以下操作:

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

$q->getResult();

对于更复杂的情况,请查看Expr() class

答案 3 :(得分:3)

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

答案 4 :(得分:3)

$criteria = new \Doctrine\Common\Collections\Criteria();
    $criteria->where($criteria->expr()->gt('id', 'id'))
        ->setMaxResults(1)
        ->orderBy(array("id" => $criteria::DESC));

$results = $articlesRepo->matching($criteria);

答案 5 :(得分:0)

我喜欢使用这种静态方法:

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