比較基準(正確な基準だけでなく)を使用する「魔法のファインダー」findByメソッドを使用する必要があります。つまり、次のようなことをする必要があります。
$result = $purchases_repository->findBy(array("prize" => ">200"));
賞金が 200 を超えるすべての購入を取得できるようにします。
比較基準(正確な基準だけでなく)を使用する「魔法のファインダー」findByメソッドを使用する必要があります。つまり、次のようなことをする必要があります。
$result = $purchases_repository->findBy(array("prize" => ">200"));
賞金が 200 を超えるすべての購入を取得できるようにします。
クラスは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 の主な利点は、ここである種の戦略パターンを実装していることであり、リポジトリ、コレクション、遅延コレクション、およびSelectable
API が実装されているすべての場所で機能します。
これにより、リポジトリ用に作成した多数の特別なメソッド ( など) を取り除くことができfindOneBySomethingWithParticularRule
、代わりに、これらの特定のフィルターの 1 つを表す独自の基準クラスの作成に集中できます。
これは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();
}
DQLまたはQueryBuilderのいずれかを使用する必要があります。たとえば、 Purchase -EntityRepositoryでは、次のようなことができます。
$q = $this->createQueryBuilder('p')
->where('p.prize > :purchasePrize')
->setParameter('purchasePrize', 200)
->getQuery();
$q->getResult();
さらに複雑なシナリオについては、Expr() クラスを見てください。
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から