2015-09-03 20 views
6

Ich versuche, die folgende Abfrage zu tun:Wie man eine UNION mit Lehre macht?

public function findByNotifications($ownerId) 
    { 
     $em = $this->getEntityManager(); 
     $query = $em->createQuery(' 
      SELECT n FROM 
      (SELECT n FROM DelivveWebBundle:UserAd n 
       INNER JOIN n.ad ad 
        WHERE ad.owner = :ownerId 
       LIMIT 20 
      UNION 
      SELECT n FROM DelivveWebBundle:UserAd n 
       INNER JOIN n.user u 
       INNER JOIN n.ad ad 
        WHERE u.id = :ownerId 
         AND ad.status = :progress 
       LIMIT 20) 
      notofication 
      LIMIT 20; 
     ')->setParameter('ownerId', $ownerId) 
      ->setParameter('progress', Constant::AD_IN_PROGRESS); 

     $result = $query->getResult(); 

     return $result; 
    } 

alle meine Benachrichtigungen zu generieren:

public function showNotificationsAction() 
    { 
     $this->denyAccessUnlessGranted('ROLE_USER', null, 'Unable to access this page!'); 

     $owner = $this->getUser(); 

     $repository = $this->getDoctrine()->getRepository('DelivveWebBundle:UserAd'); 

     $notifications = $repository->findByAdOwner($owner->getId()); 

     return $this->render('DelivveWebBundle:Ad:notification.html.twig', array(
      'owner' => $owner, 
      'notifications' => $notifications 
     )); 
    } 

Die Idee ist, eine Suche auf ADUser Tabelle zu tun, die alle Benachrichtigungen zurückgibt, die Anzeigen haben, die Der angemeldete Benutzer besitzt zusammen mit allen Benachrichtigungen, die den angeforderten Benutzer protokolliert haben.

Benachrichtigung Der angeforderte Benutzer ist eine Zeile der AdUser-Tabelle mit der Spalte, in der sich der Benutzer angemeldet hat. Benutzer.

+1

Die Doctrine Query Language unterstützt das Schlüsselwort 'UNION' nicht. Eine Problemumgehung finden Sie unter http://stackoverflow.com/questions/4155288/how-to-write-union-in-doctrine-2-0 –

+0

Dies wird ein Problem sein, dass Sie wissen, wird eine Möglichkeit sein, was zu tun Ich will? Die Antwort von der anderen pergunda nicht letztlich helfen mir soulação es war seine Tabelle in zwei brechen und ich will es nicht, will nur eine Liste mit den beiden Abfragen zu generieren. –

+0

Möchten Sie die ersten 20 Benachrichtigungen erhalten, bei denen der angemeldete Benutzer die Anzeige besitzt, gefolgt von den ersten 20 Benachrichtigungen, die der angemeldete Benutzer angefordert hat? Wenn ja, verstehe ich nicht, warum Sie dieses Ergebnis dann auf die ersten 20 Benachrichtigungen dieser Benachrichtigungen (Ihr letztes "LIMIT") beschränken möchten. Ist "notification" gemeint "n"? –

Antwort

2

entschied ich mich in zwei Durchsuchungen und gibt ein marge in den Ergebnissen

public function findByAdOwner($ownerId) 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder('n'); 

    return $qb->select('n') 
     ->from('DelivveWebBundle:UserAd', 'n') 
     ->join('n.ad', 'ad') 
     ->where('ad.owner = :ownerId') 
     ->setParameter('ownerId', $ownerId) 
     ->setMaxResults(20) 
     ->getQuery() 
     ->getResult(); 
} 

public function findByUserNotify($userId) 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder('n'); 

    return $qb->select('n') 
     ->from('DelivveWebBundle:UserAd', 'n') 
     ->join('n.ad', 'ad') 
     ->where('n.user = :userId') 
     ->andWhere('ad.status = :status') 
     ->setParameter('userId', $userId) 
     ->setParameter('status', Constant::AD_IN_PROGRESS) 
     ->setMaxResults(20) 
     ->getQuery() 
     ->getResult(); 
} 

public function findNotifcations($userId){ 
    $notification = $this->findByAdOwner($userId); 
    $append = $this->findByUserNotify($userId); 

    return array_merge($notification, $append); 
} 

Um mehr readable'll zu werden nur bringen kann, etwas zu brechen, den die beiden Arten von Hinweis unterscheidet man auf der Seite, die Behandlung zu tun.

Ich entdeckte, dass es einen Weg gibt, Befehle zu der Doktrin hinzuzufügen, die nicht existiert, aber scheint ziemlich komplex zu sein, wenn irgendjemand dies tun sollte, setzen Sie die Antwort bitte.