Подзапрос Symfony2 в менеджере сущностей Doctrine - PullRequest
6 голосов
/ 08 марта 2012

Мне нужно выполнить этот запрос:

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

В Symfony2 с помощью диспетчера сущностей.

Мой базовый построитель запросов будет выглядеть так:не может понять, как добавить в подзапрос к этому.

Я попытался создать отдельный запрос и присоединиться к нему, например:

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

Но я получаю:

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

Ответы [ 2 ]

8 голосов
/ 09 марта 2012

Вы можете использовать DBAL для выполнения любого 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

счастливое кодирование

8 голосов
/ 08 марта 2012

Один трюк состоит в том, чтобы создать два запроса и затем использовать getDQL () для подачи первого запроса во второй запрос.

Например, этот запрос возвращает отдельный список идентификаторов игр:

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

Теперь используйте dql, чтобы получить дополнительную информацию о самих играх:

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

Вид длинного примера, но я не хотел редактировать материал и, возможно, сломать его.

...