Как использовать метод findBy со сравнительными критериями



Мне нужно будет использовать метод findBy "magic finder" с использованием сравнительных критериев (а не только точных критериев). Другими словами, Мне нужно сделать что-то вроде этого:



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


Так что я бы получил все покупки, где приз выше 200.

882   5  

5 ответов:

Это пример использования 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();
}

класс Doctrine\ORM\EntityRepository осуществляет Doctrine\Common\Collections\Selectable API.

The Selectable интерфейс очень гибкий и довольно новый, но он позволит вам легко обрабатывать сравнения и более сложные критерии как в репозиториях, так и в отдельных коллекциях элементов, независимо от того, есть ли в ORM или ODM или полностью отдельные проблемы.

это будет критерием сравнения, как вы только что просили, как в доктрине ORM 2.3.2:

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

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

главные преимущество этого API заключается в том, что вы реализуете здесь какой-то шаблон стратегии, и он работает с репозиториями, коллекциями, ленивыми коллекциями и везде Selectable API реализован.

это позволяет вам избавиться от десятков специальных методов, которые вы написали для своих репозиториев (например,findOneBySomethingWithParticularRule), и вместо того, чтобы сосредоточиться на написании собственных классов критериев, каждый из которых представляет один из этих фильтров.

вы должны использовать либо DQL или QueryBuilder. Например, в вашей покупке -EntityRepository вы могли бы сделать что-то вроде этого:

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

$q->getResult();

для еще более сложных сценариев взгляните на Expr () class.

документация 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

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

$results = $articlesRepo->matching($criteria);

Comments

    Ничего не найдено.