2012-03-08 108 views
6

necesito para llevar a cabo esta consulta:Symfony2 subconsulta dentro Doctrina gestor de la entidad

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

En Symfony2 utilizando el gestor de la entidad.

Mi generador de consultas básica sería:

$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(); 

, pero no puedo encontrar la manera de poner en una subconsulta para esto.

He intentado hacer una consulta independiente y unirse a ella como:

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

pero me sale:

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

Respuesta

8

Un truco es construir dos consultas y luego usar getDQL() para alimentar a la primera consulta en la segunda consulta.

Por ejemplo, esta consulta devuelve una lista distinta de identificadores de juego:

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

utilizan ahora el DQL para obtener información adicional acerca de los juegos en sí:

$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())); 

especie de larga ejemplo, pero No quería editar cosas y quizás romperlas.

+0

creo que esta solución está ignorando límite en @cerad subconsulta. E.g $ qbGameId-> setMaxResults (20) y cuando imprime $ qbGames-> getDQL() no verá el límite en la subconsulta. – EnchanterIO

+0

Una posible solución: http://stackoverflow.com/questions/15877287/symfony2-doctrine-expr-subquery-error?answertab=active#tab-top – EnchanterIO

8

Puede usar DBAL para realizar cualquier consulta 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 

feliz de codificación

+0

Luchando para decidir a quién aceptar como mi respuesta. En realidad fui con esta ruta porque es más pequeña, pero no usa el generador de consultas como la respuesta de Cerads. – BobFlemming

+0

Thx asish! y BTW solo un pequeño consejo para otros usuarios que aún no dominan Symfony2 ... si escribe esta consulta en el repositorio, la conexión se puede obtener a través de $ conn = $ this -> _ em-> getConnection(); – EnchanterIO

+0

El problema con esta solución es que devuelve datos en bruto en lugar de objetos de entidad :( – Timwi

Cuestiones relacionadas