2016-05-18 16 views
0

Ich möchte kein Produkt auf meiner Indexseite anzeigen, wenn die Menge dieses Produkts gleich 1 ist. Die Menge des Produkts wird in der Tabelle Menge gespeichert. Die Tischmenge ist Link zum Produkt (ManyToOne).Eine Join-Abfrage mit Doctrine Query Builder ausführen

Das habe ich gemacht.

public function product($id) 
    { 
     $query = $this->createQueryBuilder('e') 
      ->leftJoin('e.quantity', 'r') 
      ->where('r.quantity = :id') 
      ->setParameter('id', $id) 
      ->getQuery(); 

     return $query->getResult(); 
    } 

Menge

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Post", cascade={"remove"}) 
    * @ORM\JoinColumn(name="product_id", referencedColumnName="id") 
    */ 
    protected $desk2; 

    /** 
    * @var integer 
    * @ORM\Column(name="quantity", type="integer", nullable=true) 
    */ 
    protected $quantity; 

Produkt

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 

private $id; 
/** 
* @var string 
* 
* @ORM\Column(name="telephone", type="string", length=30) 
*/ 
private $telephone; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=125) 
*/ 
private $name; 

/** 
* @var string 
* 
* @ORM\Column(name="description", type="text" , length=125) 
*/ 
private $description; 

Index

public function indexvAction($id) 
    { 

     $session = $this->getRequest()->getSession(); 
     $em = $this->getDoctrine()->getManager(); 
     $findEntities = $em->getRepository('FLYBookingsBundle:Post')->product($id); 
     $entity = $this->get('knp_paginator')->paginate($findEntities, $this->get('request')->query->get('page', 1), 9 
     ); 
     if ($session->has('cart')) 
      $cart = $session->get('cart'); 
     else 
      $cart = false; 
     return $this->render('FLYBookingsBundle:Post:indexv.html.twig', array('entity' => $entity, 
      'cart' => $cart)); 
    } 

EDIT:

default: index.html.twig

{% extends "::base.html.twig" %} 
     {% block newadvert %} 
       <div class="span4 offset1"> 
       </div> 
       {{ render(controller('FLYBookingsBundle:Post:indexv')) }} 
     {% endblock newadvert %} 

Controller:

public function indexAction() 
    { 

    return $this->render('FLYPlatformBundle:Default:index.html.twig'); 


    } 

Antwort

2

Diese nur Produkte mit Mengen> 1 (oder was auch immer Menge zurück Parameter, den Sie übergeben).

public function product($quantityLimit) 
    { 
     $query = $this->createQueryBuilder('e') 
      ->join('e.quantity', 'r') 
      ->addSelect('r') 
      ->where('r.quantity > :quantityLimit') 
      ->setParameter('quantityLimit', $quantityLimit) 
      ->getQuery(); 

     return $query->getResult(); 
    } 

Wenn Sie wollten alle Produkte zurück, aber nur Mengen, wo sie sind> 1 würden Sie eine leftJoin wie so verwenden.

public function product($quantityLimit) 
    { 
     $query = $this->createQueryBuilder('e') 
      ->leftJoin('e.quantity', 'r', 'WITH', 'r.quantity > :quantityLimit') 
      ->addSelect('r') 
      ->setParameter('quantityLimit', $quantityLimit) 
      ->getQuery(); 

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

Vielen Dank für Ihre Antwort. Ich habe versucht, was Sie vorgeschlagen, aber ich habe diesen Fehler: 'Eine Ausnahme wurde beim Rendern einer Vorlage geworfen (" Controller "FLY \ BookingsBundle \ Controller \ PostController :: indexvAction()" erfordert, dass Sie einen Wert für die " $ quantityLimit "Argument (weil es keinen Standardwert gibt oder weil hinter diesem ein nicht optionales Argument steht).") in FLYPlattformBundle: Standard: index.html.twig in Zeile 5. "Ich habe meinen Beitrag oben mit dem Standard aktualisiert index.html.twig – Sirius

+0

Sie müssen den Parameter quantityLimit an Ihre indexvAction übergeben - das ist kein Problem mit der Abfrage, nur wie Sie Ihre Route aufrufen. Siehe http://symfony.com/doc/current/book/routing.html#routing-with-placeholders und stellen Sie sicher, dass Sie Ihre Controller-Methode korrekt aufrufen. Z.B. http://yoursite.com/yourproductroute/1 - oder so ähnlich. – Richard

+0

Ich übergebe bereits den Parameter quantityLimit in meinem indexvAction. Die Seite indexv.html.twig wird in der Seite index.html.twig dargestellt. Und ich denke, das Problem kommt von dieser Zeile: '{{render (Controller ('FLYBookingsBundle: Post: indexv'))}}' – Sirius