2016-04-29 18 views
1

Ich habe eine Seite in Symfony erstellt, die den Doctrine Query Builder verwendet, um Ergebnisse zurückzugeben. Die Seite enthält auch Suchfunktionen. Die Seite funktioniert im Moment einwandfrei, aber ich frage mich, ob der Doctrine Query Builder-Abschnitt meines Codes neu berechnet werden kann.Ist es möglich, zu einer vorhandenen Doctrine Query hinzuzufügen?

Also meine Frage ist, anstatt Kopieren und Einfügen der gleichen Abfrage (wie ich dies unten in meinem Code ($ results)) und Hinzufügen von zusätzlichen 'where' und 'setParameter' Methoden zum Abfrage-Generator, ist es möglich, die zusätzlichen Optionen nur an die erste Abfrage anzuhängen, damit ich Code nicht erneut verwenden muss?

$em = $this->getDoctrine()->getManager('managerName'); 
$results = $em->createQueryBuilder() 
     ->select('d.name','d.createdAt') 
     ->from('ManagerName:Demo', 'd') 
     ->orderBy('d.name') 
     ->getQuery() 
     ->getResult(); 

if ($form->isSubmitted() && $form->isValid()) { 
    if (isset($_POST['submit'])) { 
     $em = $this->getDoctrine()->getManager('managerName'); 
     $results = $em->createQueryBuilder() 
       ->select('d.name', 'd.createdAt') 
       ->from('ManagerName:Demo', 'd') 
       ->where('d.name LIKE :searchTerm') 
       ->orderBy('d.name') 
       ->setParameter('searchTerm', '%' . $search->getSearch() . '%') 
       ->getQuery() 
       ->getResult(); 
      return $this->render('AcmeBundleName:Demo:index.html.twig', [ 
       "form" => $form->createView(), 
       "results" => $results, 
       "search" => $search->getSearch(), 
      ]); 
     } 
    return $this->redirect($request->getUri()); 
} 

So ein Beispiel dafür, was ich suche/versuchen zu bekommen wäre wie folgt aus:

$em = $this->getDoctrine()->getManager('managerName'); 

$query = $em->createQueryBuilder() 
     ->select('d.name','d.createdAt') 
     ->from('ManagerName:Demo', 'd') 
     ->orderBy('d.name') 
     ->getQuery(); 

$results = $query->getResult(); 

if ($form->isSubmitted() && $form->isValid()) { 
    if (isset($_POST['submit'])) {     
     $em = $this->getDoctrine()->getManager('managerName'); 

     $results = $query->where('d.name LIKE :searchTerm') 
       ->setParameter('searchTerm', '%' . $search->getSearch() . '%'); 

     return $this->render('AcmeBundleName:Demo:index.html.twig', [ 
       "form" => $form->createView(), 
       "results" => $results, 
       "search" => $search->getSearch(), 
      ]); 
    } 
    return $this->redirect($request->getUri()); 
} 

Ich habe keine Ahnung, ob ihre möglich, die Abfrage zu verlängern Ich habe das vorher aufgebaute und stundenlang googelnde System scheint keine nützlichen Quellen zu liefern, mit denen ich mich identifizieren kann.

Ich habe auch durch viel Lehre Dokumentation sah, einschließlich der folgenden ohne Erfolg: http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html

Vielen Dank im Voraus

+0

Nach der ersten Deklaration von '$ results' wird die Variable nie verwendet. Wird es in einem Code verwendet, der hier nicht gezeigt wird? –

+1

Ich übergebe es schließlich als Parameter beim Rendern der Seite, aber da ich mehr daran interessiert bin, meinen Code zu re-factory und den aktuellen Code funktioniert, habe ich nicht alle meine Code enthalten. – DannyDanDan

Antwort

1

In diesem Fall müssen Sie nur anrufen getQuery(), wenn Sie die Anfrage durchführen:

$em = $this->getDoctrine()->getManager('managerName'); 

$query = $em->createQueryBuilder() 
     ->select('d.name','d.createdAt') 
     ->from('ManagerName:Demo', 'd') 
     ->orderBy('d.name'); 

$results = $query 
    ->getQuery() 
    ->getResult(); 

if ($form->isSubmitted() && $form->isValid()) { 
    if (isset($_POST['submit'])) {     
     $results = $query->where('d.name LIKE :searchTerm') 
       ->setParameter('searchTerm', '%' . $search->getSearch() . '%') 
       ->getQuery() 
       ->getResult(); 

     return $this->render('AcmeBundleName:Demo:index.html.twig', [ 
      "form" => $form->createView(), 
      "results" => $results, 
      "search" => $search->getSearch(), 
     ]); 
    } 
    return $this->redirect($request->getUri()); 
} 

$query ist eine Instanz von \Doctrine\ORM\QueryBuilder und Sie können auf dieses Objekt where() usw. nennen.

Dann müssen Sie $query->getQuery()->getResult(); aufrufen, um die Abfrage durchzuführen.

Bitte beachte, dass ich diese doppelte Linie auch entfernen:

$em = $this->getDoctrine()->getManager('managerName'); 
+1

Ausgezeichnet, vielen Dank dafür. Ich wusste, es wäre etwas Einfaches, aber nichts, was ich versuchte, schien zu funktionieren! Freitagnachmittag ey ... – DannyDanDan

0

Sicher. Wenn Sie das Querybuilder-Objekt trennen, ist das ziemlich trivial.

$qb = $em->createQueryBuilder() 
     ->select('d.name','d.createdAt') 
     ->from('ManagerName:Demo', 'd') 
     ->orderBy('d.name'); 

$query = $qb->getQuery(); 
Verwandte Themen