web-dev-qa-db-ja.com

比較基準でfindByメソッドを使用する方法

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

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

賞金が200を超えるすべての購入品を受け取ることができます。

72
ElPiter

これは 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();
}
29
con

クラス Doctrine\ORM\EntityRepositoryDoctrine\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 AP​​Iが実装されているすべての場所で動作します。

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

180
Ocramius

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

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

$q->getResult();

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

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

$results = $articlesRepo->matching($criteria);
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

3
Jeff Clemens