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

ElP*_*ter 72 php symfony doctrine-orm

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

$result = $purchases_repository->findBy(array("prize" => ">200"));
Run Code Online (Sandbox Code Playgroud)

这样我就可以获得奖金超过200的所有购买.

Ocr*_*ius 181

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

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);
Run Code Online (Sandbox Code Playgroud)

此API的主要优点是您在此处实现某种策略模式,它适用于存储库,集合,惰性集合以及SelectableAPI实现的所有位置.

这允许您摆脱为存储库编写的许多特殊方法(如findOneBySomethingWithParticularRule),而是专注于编写自己的条件类,每个类代表一个特定的过滤器.

  • 非常非常好的方法.Thanx Ocramius! (4认同)
  • 在我看来,拥有像“findOneBySomethingWithPspecialRule”这样的具体存储库方法是一件好事,因为它将您的业务逻辑与 Doctrine 实现细节(如标准构建器)分离。 (4认同)
  • 注意:我正在使用带有教义的symfony 2.8.11 - 也许只是那里 - 它是"Criteria :: expr() - > gt()",而不是"$ criteria-> expr() - > gt()". (2认同)
  • 这是一个静态方法:https://github.com/doctrine/collections/blob/2dfc898f2a66c192d6a195bdc9c5040f65adfaab/lib/Doctrine/Common/Collections/Criteria.php#L83另外:Symfony是*NOT*Doctrine.参考带有学说名称和版本控制的学说:-P (2认同)
  • `Criteria :: expr()`也行 - 随意编辑答案. (2认同)

con*_*con 30

这是一个使用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();
}
Run Code Online (Sandbox Code Playgroud)

  • @Sliq在你尝试了一些更多的框架后,你会发现Symfony并不那么糟糕 (12认同)
  • 如果不是严格需要,请避免使用DQL,它只是让您的逻辑越来越多地与ORM耦合. (11认同)
  • @Sliq这是一种学说行为,并不一定与symfony有任何关系. (9认同)

dbr*_*ann 6

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

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

$q->getResult();
Run Code Online (Sandbox Code Playgroud)

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

  • 避免在严格必要的地方使用DQL.它将您锁定在ORM特定的API中,并且实际上不可重用.在某些情况下需要DQL,但这不是其中之一. (5认同)
  • 如何使用QueryBuilder以完全相同的方式锁定你的学说? (3认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)