85

比較基準(正確な基準だけでなく)を使用する「魔法のファインダー」findByメソッドを使用する必要があります。つまり、次のようなことをする必要があります。

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

賞金が 200 を超えるすべての購入を取得できるようにします。

4

7 に答える 7

213

クラスはAPI をDoctrine\ORM\EntityRepository実装します。Doctrine\Common\Collections\Selectable

インターフェースは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 の主な利点は、ここである種の戦略パターンを実装していることであり、リポジトリ、コレクション、遅延コレクション、およびSelectableAPI が実装されているすべての場所で機能します。

これにより、リポジトリ用に作成した多数の特別なメソッド ( など) を取り除くことができfindOneBySomethingWithParticularRule、代わりに、これらの特定のフィルターの 1 つを表す独自の基準クラスの作成に集中できます。

于 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

DQLまたはQueryBuilderのいずれかを使用する必要があります。たとえば、 Purchase -EntityRepositoryでは、次のようなことができます。

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

$q->getResult();

さらに複雑なシナリオについては、Expr() クラスを見てください。

于 2013-02-09T10:18:58.167 に答える
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 に答える