2017-02-18 8 views
-1

Ich bin konfrontiert, um eine Abfrage (oder SQL-Anfrage) in einem meiner Repository zu tun. Jedes Beispiel, das ich sind sehr komplex gesucht, und ich wollte eine grundlegende Erklärung eines GrundquerybuilderGrundlegende QueryBuilder - Symfony3

Ich habe einen Controller namens RestaurantController ich ein RestaurantRepository, wo ich weiß, ich sollte meine Frage tun.

class RestaurantRepository extends \Doctrine\ORM\EntityRepository 
{ 

} 

Ich habe meine Einheit Restaurant.php genannt, wo ich 2 Spalten (ohne die ID ein)

  • Namen
  • Stadt

Also im Grunde möchte ich eine Abfrage machen wo ich meine city abholen kann und dann aus meiner Sicht damit arbeiten kann. Wie kann ich das machen? :/

Ich habe eine direkt in meinem Controller:

$em = $this->getDoctrine()->getManager(); 
$restaurants = $em->getRepository('AppBundle:Restaurant')->findBy(array('city' => $request->request->get('city'))); 

aber das funktioniert nicht gut, so mag ich wissen, wie man wirklich einen richtigen und einfache Querybuilder zu machen. Danke

+0

Schritt für Schritt? Beginnen Sie hier: http://symfony.com/doc/current/doctrine.html – Cerad

Antwort

1

Wenn Sie sagen, aber das funktioniert nicht, sollten Sie überprüfen, dass $request->request->get('city') einen gültigen Stadtnamen zurückgeben. In Ihrem Controller können Sie return var_dump($request->request->get('city') und überprüfen, ob Sie die erwartete Stadt haben. Meiner Meinung nach sollte es $request->get('city') sein. Also im Grunde:

$em = $this->getDoctrine()->getManager(); 
$currentCity = $request->request->get('city') 
return var_dump($currentCity)//make sur that you have a valid city 
$restaurants = $em->getRepository('AppBundle:Restaurant')->findBy(array('city' => $currentCity)); 

Sie können eine benutzerdefinierte Abfrage machen, aber es ist viel des Guten für Ihren Bedarf

class RestaurantRepository extends EntityRepository 
{ 
    public function getRestaurantByCity($city) 
    { 
     $query = $this->createQueryBuilder('r') 
         ->where('r.city = :city') 
         ->setParameter('city', $city) 
          ; 

     return $query->getQuery()->getResult(); 
    } 
} 
+0

Hallo! ich danke Ihnen sehr für Ihre Antwort! Ich dachte, niemand würde mir antworten :) Können Sie mir erklären, warum Sie '' r'' in den createQueryBuilder setzen? Was bedeutet all diese Interpunktionen? '=: city' Wie kann ich diesen QueryBuilder auch an meine Ansicht übergeben? Du hast 'return $ query-> getQuery() -> getResult() geschrieben;' Wie kann ich es in meinem Zweig wissen und benutzen? –

+0

Sie sollten sich wirklich die [doc] (http://symfony.com/doc/current/doctrine.html#querying-for-objects-using-doctrine-s-query-builder) ansehen. Das heißt, "r" ist ein Alias ​​(Sie können es "bestDevEver" nennen, wenn Sie möchten). '=: city' bedeutet, Restaurant zu holen, wo das Stadtfeld der gegebenen Zeichenfolge entspricht. Um SQL Injection zu vermeiden, erstellen Sie eine lokale Variable in der Abfrage und weisen ihren Wert mit 'setParameter()' zu. In Ihrer Zweigvorlage können Sie auf die Restauranteigenschaften in for for loop zugreifen, etwa durch {{restaurant.city}}. Ein Tipp, Sie sollten wirklich ein Tuto folgen oder einige Dokumente lesen ... – mickdev

+0

Vielen Dank, ich werde versuchen, ich lese eine Menge Dokumente, aber ich weiß immer nicht, wo ich anfangen soll, aber ich danke Ihnen für Ihre Hilfe. Ich werde deine Antwort anwenden. –