2012-03-08 24 views
6

muszę wykonać to zapytanie:Symfony2 Podzapytanie ciągu Doctrine kierownika jednostki

SELECT * FROM (SELECT * FROM product WHERE car = 'large' ORDER BY onSale DESC) AS product_ordered GROUP BY type 

W Symfony2 pomocą menedżera podmiotu.

Mój podstawowy kreator zapytań byłoby:

$query = $em->getRepository('AutomotiveBundle:Car') 
     ->createQueryBuilder('p') 
     ->where('pr.car = ?1') 
     ->andWhere('pr.status = 1') 
     ->orderBy('pr.onSale', 'DESC') 
     ->setParameter(1, $product->getName()) 
     ->groupBy('p.type') 
     ->getQuery(); 

Ale nie mogę dowiedzieć się, jak dodać w podkwerendzie do tego.

Ive wypróbowany podejmowania oddzielne kwerendy i łączenie go tak:

->andWhere($query->expr()->in('pr.car = ?1',$query2->getQuery())); 

Ale otrzymuję:

Call to undefined method Doctrine\ORM\Query::expr() 

Odpowiedz

8

Jeden trick jest budowanie dwa zapytania, a następnie użyć getDQL(), aby nakarmić pierwszy zapytanie do drugiego zapytania.

Na przykład, ta kwerenda zwraca odrębną listę identyfikatorów gra:

$qbGameId = $em->createQueryBuilder(); 

    $qbGameId->addSelect('distinct gameGameId.id'); 

    $qbGameId->from('ZaysoCoreBundle:Event','gameGameId'); 

    $qbGameId->leftJoin('gameGameId.teams','gameTeamGameId'); 

    if ($date1) $qbGameId->andWhere($qbGameId->expr()->gte('gameGameId.date',$date1)); 
    if ($date2) $qbGameId->andWhere($qbGameId->expr()->lte('gameGameId.date',$date2)); 

teraz używać DQL, aby uzyskać dodatkowe informacje na temat samych gier:

$qbGames = $em->createQueryBuilder(); 

    $qbGames->addSelect('game'); 
    $qbGames->addSelect('gameTeam'); 
    $qbGames->addSelect('team'); 
    $qbGames->addSelect('field'); 

    $qbGames->addSelect('gamePerson'); 
    $qbGames->addSelect('person'); 

    $qbGames->from('ZaysoCoreBundle:Event','game'); 

    $qbGames->leftJoin('game.teams', 'gameTeam'); 
    $qbGames->leftJoin('game.persons', 'gamePerson'); 
    $qbGames->leftJoin('game.field', 'field'); 

    $qbGames->leftJoin('gameTeam.team',  'team'); 
    $qbGames->leftJoin('gamePerson.person', 'person'); 

    // Here is where we feed in the dql 
    $qbGames->andWhere($qbGames->expr()->in('game.id',$qbGameId->getDQL())); 

Rodzaju długi przykład, ale nie chciałem edytować rzeczy i być może je łamać.

+0

Wierzę, że to rozwiązanie jest ignorowanie limit podzapytanie @cerad. E.g $ qbGameId-> setMaxResults (20) i kiedy wypiszesz $ qbGames-> getDQL() nie zobaczysz limitu podkwerendy. – EnchanterIO

+0

Jedno z możliwych rozwiązań: http://stackoverflow.com/questions/15877287/symfony2-doctrine-expr-subquery-error?answertab=active#tab-top – EnchanterIO

8

Możesz użyć DBAL do wykonywania dowolnych zapytań sql.

$conn = $this->get('database_connection');//create a connection with your DB 

$sql="SELECT * FROM (SELECT * FROM product WHERE car =? ORDER BY onSale DESC) AS product_ordered GROUP BY type"; //Your sql Query     
$stmt = $conn->prepare($sql); // Prepare your sql 
$stmt->bindValue(1, 'large'); // bind your values ,if you have to bind another value, you need to write $stmt->bindValue(2, 'anothervalue'); but your order is important so on.. 
$stmt->execute(); //execute your sql 
$result=$stmt->fetchAll(); // fetch your result 

szczęśliwy kodowania

+0

Starając się zdecydować, kogo przyjąć jako moją odpowiedź. Tak naprawdę poszedłem z tą trasą jako mniejszą, ale nie korzystam z Kreatora zapytań takiego jak odpowiedź Cerads. – BobFlemming

+0

Thx asish! i BTW to tylko mała wskazówka dla innych użytkowników, którzy nie są jeszcze biegle w symfony2 ... jeśli napiszesz to zapytanie już w repozytorium, połączenie możesz uzyskać przez $ conn = $ this -> _ em-> getConnection(); – EnchanterIO

+0

Problem z tym rozwiązaniem polega na tym, że zwraca dane surowe zamiast obiektów encji :( – Timwi

Powiązane problemy