2015-09-03 23 views
6

Próbuję wykonać następujące zapytanie:Jak stworzyć UNIĘ z Doctrine?

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; 
    } 

generowania wszystkich moich powiadomień:

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 
     )); 
    } 

Chodzi o to, aby zrobić wyszukiwania w tabeli AdUser zwracającą wszystkie powiadomienia, które mają reklamy zalogowany Użytkownik jest właścicielem wraz z wszelkimi powiadomieniami, które zalogowały się na żądanie.

Powiadomienie żądanego użytkownika to linia tabeli AdUser, która zawiera kolumnę, w której zalogowany jest użytkownik.

+1

The Doctrine Query Language nie obsługuje słowa kluczowego "UNION". Obejście można znaleźć pod adresem http://stackoverflow.com/questions/4155288/how-to-write-union-in-doctrine-2-0 –

+0

To będzie problem, że wiesz, że będzie jakiś sposób, aby to zrobić Chcę? Odpowiedź z drugiej pergundy nie pomogła mi w tym, że zepsuł on swój stół na pół i nie chcę tego, chcę tylko wygenerować listę z dwoma zapytaniami. –

+0

Czy chcesz uzyskać pierwsze 20 powiadomień, w których zalogowany użytkownik jest właścicielem reklamy, a następnie pierwsze 20 powiadomień, których zażądał zalogowany użytkownik? Jeśli tak, to nie rozumiem, dlaczego chciałbyś, aby ten wynik był ograniczony do pierwszych 20 powiadomień o tych powiadomieniach (twój ostatni "LIMIT"). Czy "notofication" ma oznaczać 'n'? –

Odpowiedz

2

postanowiłem złamanie w dwóch poszukiwań i daje Marge w wynikach

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); 
} 

Aby stać się bardziej readable'll po prostu umieścić coś, co odróżnia dwa rodzaje wypowiedzenia zrobić zabieg na stronie.

Odkryłem, że istnieje sposób dodawania poleceń do doktryny, która nie istnieje, ale wydaje się być dość skomplikowana, jeśli ktoś wie, czy to zrobić, proszę o odpowiedź.