2012-03-08 1 views
6

Je dois effectuer cette requête:au sein de sous-requête Symfony2 gestionnaire d'entités Doctrine

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

En Symfony2 utilisant le gestionnaire d'entités.

Mon constructeur de requête de base serait:

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

Mais je ne peux pas travailler sur la façon d'ajouter dans une sous-requête à ce sujet.

Ive essayé de faire une requête distincte et se joindre comme:

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

Mais je reçois:

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

Répondre

8

Une astuce consiste à construire deux requêtes, puis utiliser getDQL() pour alimenter la première interroger dans la deuxième requête.

Par exemple, cette requête renvoie une liste distincte des ids de jeu:

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

utilisent maintenant dql pour obtenir des informations supplémentaires sur les jeux eux-mêmes:

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

Type d'un long exemple, mais Je ne voulais pas éditer des choses et peut-être le casser.

+0

Je crois que cette solution ne tient pas compte limite @cerad sous-requête. E.g $ qbGameId-> setMaxResults (20) et quand vous imprimez $ qbGames-> getDQL() vous ne verrez pas la limite sur la sous-requête. – EnchanterIO

+0

Une solution possible: http://stackoverflow.com/questions/15877287/symfony2-doctrine-expr-subquery-error?answertab=active#tab-top – EnchanterIO

8

Vous pouvez utiliser DBAL pour effectuer une requête 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 

heureux de codage

+0

Difficile de décider qui accepter comme réponse. Je suis allé avec cette route en tant que plus petit, mais il n'utilise pas le constructeur de question comme la réponse de Cerads. – BobFlemming

+0

Thx asish! et BTW juste un petit conseil pour les autres utilisateurs qui ne maîtrisent pas encore symfony2 ... si vous écrivez déjà cette requête dans le référentiel, la connexion que vous pouvez obtenir via $ conn = $ this -> _ em-> getConnection(); – EnchanterIO

+0

Le problème avec cette solution est qu'elle renvoie des données brutes au lieu des objets d'entité :( – Timwi

Questions connexes