Ich habe diesen Symfony-Code, in dem alle Kategorien abgerufen werden, die sich auf einen Blog-Abschnitt in meinem Projekt beziehen:
$category = $catrep->createQueryBuilder('cc')
->Where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->getQuery();
$categories = $category->getResult();
Dies funktioniert, aber die Abfrage enthält Duplikate:
Test Content
Business
Test Content
Ich möchte den DISTINCT
Befehl in meiner Abfrage verwenden. Die einzigen Beispiele, die ich gesehen habe, erfordern, dass ich unformatiertes SQL schreibe. Ich möchte dies so weit wie möglich vermeiden, da ich versuche, meinen gesamten Code gleich zu halten, damit alle die von Symfony2 / Doctrine bereitgestellte QueryBuilder-Funktion verwenden.
Ich habe versucht distinct()
, meiner Abfrage Folgendes hinzuzufügen :
$category = $catrep->createQueryBuilder('cc')
->Where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->distinct('cc.categoryid')
->getQuery();
$categories = $category->getResult();
Dies führt jedoch zu folgendem Fehler:
Schwerwiegender Fehler: Aufruf der undefinierten Methode Doctrine \ ORM \ QueryBuilder :: unique ()
Wie sage ich Symfony, dass sie eine bestimmte auswählen soll?
quelle
Antworten:
du könntest schreiben
select DISTINCT f from t;
wie
select f from t group by f;
Die Sache ist, dass ich gerade selbst in die Lehre einsteige, also kann ich Ihnen keine wirkliche Antwort geben. Aber Sie können, wie oben gezeigt, eine eindeutige Gruppe mit simulieren und diese in Doktrin umwandeln . Wenn Sie weitere Filter hinzufügen möchten, verwenden Sie
HAVING
nach Gruppieren nach.quelle
DISTINCT
Schlüsselwort zu verwenden, simulieren Sie es mithilfe vonGROUP BY
QueryBuilder. Er gab jedoch kein Beispiel. Hier ist eine einfache:$q = $db->createQueryBuilder(); $q->select('f')->from('t', 't')->groupBy('f');
Das funktioniert:
$category = $catrep->createQueryBuilder('cc') ->select('cc.categoryid') ->where('cc.contenttype = :type') ->setParameter('type', 'blogarticle') ->distinct() ->getQuery(); $categories = $category->getResult();
quelle
Wenn Sie die Anweisung "select ()" verwenden, können Sie Folgendes tun:
$category = $catrep->createQueryBuilder('cc') ->select('DISTINCT cc.contenttype') ->Where('cc.contenttype = :type') ->setParameter('type', 'blogarticle') ->getQuery(); $categories = $category->getResult();
quelle
Öffnen Sie einfach Ihre Repository-Datei, fügen Sie diese neue Funktion hinzu und rufen Sie sie in Ihrem Controller auf:
public function distinctCategories(){ return $this->createQueryBuilder('cc') ->where('cc.contenttype = :type') ->setParameter('type', 'blogarticle') ->groupBy('cc.blogarticle') ->getQuery() ->getResult() ; }
Dann in Ihrem Controller:
public function index(YourRepository $repo) { $distinctCategories = $repo->distinctCategories(); return $this->render('your_twig_file.html.twig', [ 'distinctCategories' => $distinctCategories ]); }
Viel Glück!
quelle