Ich müsste eine findBy-Methode mit "Magic Finder" verwenden, die Vergleichskriterien verwendet (nicht nur genaue Kriterien). Mit anderen Worten, ich muss so etwas tun:
$result = $purchases_repository->findBy(array("prize" => ">200"));
damit ich alle Einkäufe bekomme, bei denen der Preis über 200 liegt.
php
symfony
doctrine-orm
ElPiter
quelle
quelle
Antworten:
Dies ist ein Beispiel für die Verwendung der Expr () - Klasse. Ich brauchte dies auch vor einigen Tagen und brauchte einige Zeit, um herauszufinden, wie die genaue Syntax und Verwendungsart lautet:
/** * 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(); }
quelle
$this->createQueryBuilder('p')
über EntityManager direkt zu gehen, anstatt herumzugehen :$this->getEntityManager()->createQueryBuilder()
.Die Klasse
Doctrine\ORM\EntityRepository
implementiert dieDoctrine\Common\Collections\Selectable
API.Die
Selectable
Benutzeroberfläche ist sehr flexibel und recht neu, aber Sie können Vergleiche und komplexere Kriterien sowohl für Repositorys als auch für einzelne Sammlungen von Elementen problemlos verarbeiten, unabhängig davon, ob es sich um ORM- oder ODM-Probleme oder um vollständig separate Probleme handelt.Dies wäre ein Vergleichskriterium, wie Sie es gerade angefordert haben, wie in Doctrine ORM
2.3.2
:$criteria = new \Doctrine\Common\Collections\Criteria(); $criteria->where($criteria->expr()->gt('prize', 200)); $result = $entityRepository->matching($criteria);
Der Hauptvorteil dieser API besteht darin, dass Sie hier eine Art Strategiemuster
Selectable
implementieren. Sie funktioniert mit Repositorys, Sammlungen, verzögerten Sammlungen und überall dort, wo die API implementiert ist.Auf diese Weise können Sie Dutzende spezieller Methoden entfernen, die Sie für Ihre Repositorys geschrieben haben (wie z. B.
findOneBySomethingWithParticularRule
), und sich stattdessen darauf konzentrieren, Ihre eigenen Kriterienklassen zu schreiben, die jeweils einen dieser bestimmten Filter darstellen.quelle
$criteria::expr()->gt()
ideal sein, nein?Criteria::expr()
auch OK - Sie können die Antwort jederzeit bearbeiten.findOneBySomethingWithParticularRule
IMO sind eine gute Sache, da sie Ihre Geschäftslogik von Details der Doctrine-Implementierung wie dem Kriterien-Builder entkoppeln.Sie müssen entweder DQL oder den QueryBuilder verwenden . Zum Beispiel könnten Sie in Ihrem Purchase- EntityRepository Folgendes tun:
$q = $this->createQueryBuilder('p') ->where('p.prize > :purchasePrize') ->setParameter('purchasePrize', 200) ->getQuery(); $q->getResult();
Für noch komplexere Szenarien werfen Sie einen Blick auf die Expr () - Klasse .
quelle
$criteria = new \Doctrine\Common\Collections\Criteria(); $criteria->where($criteria->expr()->gt('id', 'id')) ->setMaxResults(1) ->orderBy(array("id" => $criteria::DESC)); $results = $articlesRepo->matching($criteria);
quelle
Die Symfony-Dokumentation zeigt nun explizit, wie das geht:
$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();
Von http://symfony.com/doc/2.8/book/doctrine.html#querying-for-objects-with-dql
quelle
Ich verwende gerne solche statischen Methoden:
$result = $purchases_repository->matching( Criteria::create()->where( Criteria::expr()->gt('prize', 200) ) );
Natürlich können Sie die Logik pushen, wenn es sich um eine Bedingung handelt. Wenn Sie jedoch mehr Bedingungen haben, ist es besser, sie in Fragmente zu unterteilen, zu konfigurieren und an die Methode zu übergeben:
$expr = Criteria::expr(); $criteria = Criteria::create(); $criteria->where($expr->gt('prize', 200)); $criteria->orderBy(['prize' => Criteria::DESC]); $result = $purchases_repository->matching($criteria);
quelle