85

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

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

这样我就能得到所有奖金超过 200 的购买。

4

7 回答 7

213

该类Doctrine\ORM\EntityRepository实现Doctrine\Common\Collections\SelectableAPI。

Selectable界面非常灵活且非常新,但它允许您在存储库和单个项目集合上轻松处理比较和更复杂的标准,无论是在 ORM 或 ODM 中还是完全独立的问题。

这将是您刚刚在 Doctrine ORM 中要求的比较标准2.3.2

$criteria = new \Doctrine\Common\Collections\Criteria();
$criteria->where(\Doctrine\Common\Collections\Criteria::expr()->gt('prize', 200));

$result = $entityRepository->matching($criteria);

这个 API 的主要优点是你在这里实现了某种策略模式,它适用于存储库、集合、惰性集合以及Selectable实现 API 的任何地方。

这使您可以摆脱为存储库编写的数十种特殊方法(例如findOneBySomethingWithParticularRule),而专注于编写自己的标准类,每个标准类都代表这些特定过滤器之一。

于 2013-02-09T16:20:15.490 回答
32

这是一个使用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();
}
于 2013-02-09T12:58:43.843 回答
7

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

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

$q->getResult();

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

于 2013-02-09T10:18:58.167 回答
6
$criteria = new \Doctrine\Common\Collections\Criteria();
    $criteria->where($criteria->expr()->gt('id', 'id'))
        ->setMaxResults(1)
        ->orderBy(array("id" => $criteria::DESC));

$results = $articlesRepo->matching($criteria);
于 2017-10-03T13:23:39.033 回答
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

于 2016-04-18T16:33:11.060 回答
1

复制 findBy 查询并对其进行修改以返回您的预期结果是一种好方法。

于 2022-01-18T14:20:26.453 回答
0

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

$result = $purchases_repository->matching(
    Criteria::create()->where(
        Criteria::expr()->gt('prize', 200)
    )
);

当然,当条件为1的时候可以push逻辑,但是当条件比较多的时候最好还是分片,配置后传给方法:

$expr = Criteria::expr();

$criteria = Criteria::create();
$criteria->where($expr->gt('prize', 200));
$criteria->orderBy(['prize' => Criteria::DESC]);

$result = $purchases_repository->matching($criteria);
于 2019-11-20T10:13:34.363 回答