2016-12-17 2 views
1

Я работаю над Symfony 3.2, и я пытаюсь выполнить «простой» запрос. Это версия SQL-запроса, который работает (проверено непосредственно в PhpMyAdmin)Symfony & Doctrine: DQL Max() с groupBy

SELECT s.* 
FROM pl_statsheet s 
INNER JOIN (
SELECT day, MAX(points) AS points 
FROM pl_statsheet 
GROUP BY day 
) ps 
ON s.day = ps.day AND s.points = ps.points 

Unfortunelty, я не могу «конвертировать», чтобы работать с Symfony. Поблагодарили бы за помощь. Это то, что я сделал до сих пор. В моем хранилище

$query = $this->getEntityManager() 
    ->createQuery(
     'SELECT s 
     FROM PlayoffBundle:Statsheet s 
     INNER JOIN (
      SELECT day, MAX(points) AS points 
      FROM PlayoffBundle:Statsheet 
      GROUP BY day 
     ) AS ps 
     ON s.day = ps.day AND s.points = ps.points' 
    ) 
    ->getResult(); 

И эта Ошибке Symfony возвращает

QueryException: [Semantical Error] line 0, col 55 near '( SELECT': Error: Class '(' is not defined.

Спасибо за любую помощь. Я еще новичок в Symfony;) ​​


Update.

Поскольку я не согласен с собственным SQL. Я решил сделать это в 2-х запросах. 1/С собственным SQL, я получу идентификаторы с max (points) 2/С ORM, я просто сделаю findById ($ arrayIDs). Делая так, потому что у меня есть ManyToMany отношения, и это легче для меня, чтобы получить полные данные

Так что почти работает, но по причине я не могу undestand, мой второй запрос дает нуль, как это:

Statsheet {#968 ▼ 
-id: 20 
-stats: null 
-points: null 
-day: null 
-player: null 
-game: null 

}

Так что я сделал несколько тестов. Я знаю, что ID 20 представляет собой максимальное значение

Например, это:

dump($em->getRepository('PlayoffBundle:Statsheet')->find(19)); 

-> даст все данные правильно.

dump($em->getRepository('PlayoffBundle:Statsheet')->find(20)); 

-> даст то, что я только что отправил несколько строк выше (нуль везде кроме мазута для ид)

Но если я делаю -> находку (20) до NativeSQL он дает мне данные правильно.

Я не знаю, достаточно ли разъяснений. Если необходимо, я могу предоставить скриншот сообщений dump() и кода моего контроллера/репозитория/объекта.


StatsheetRepository.php

public function getBestPickId() 
{ 

    $sql = 'SELECT s.* FROM pl_statsheet s INNER JOIN (SELECT day, MAX(points) AS points FROM pl_statsheet GROUP BY day) ps ON s.day = ps.day AND s.points = ps.points'; 

    $rsm = new ResultSetMapping; 
    $rsm->addEntityResult('PlayoffBundle:Statsheet', 's'); 
    $rsm->addFieldResult('s', 'id', 'id'); 
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
    $picks = $query->getResult(); 

    foreach($picks as $pick){ 
     $ids[] = $pick->getId(); 
    } 
    return $ids; 
} 

И это мой контроллер

 $bestpicksIds = $em->getRepository('PlayoffBundle:Statsheet')->getBestPickId(); 
    $bestpicks = $em->getRepository('PlayoffBundle:Statsheet')->findById($bestpicksIds); 

    dump($em->getRepository('PlayoffBundle:Statsheet')->find(20)); 
    dump($em->getRepository('PlayoffBundle:Statsheet')->find(19)); 
    dump($bestpicks); 

Итак, позвольте мне объяснить быстро. ID 19 не лучший выбор, но 20. Итак, -> find (19) дает все необходимые данные , но -> find (20) и дамп ($ bestpicks) дает только идентификаторы, а остальные данные NULL Вот что делает мой код прямо сейчас (возможно, это поможет понять): Dump Symfony

Я знаю, что проблема исходит из собственного SQL-запроса.Я не знаю, почему это влияет на мой следующий запрос. Так что для обновления моей ситуации. Я знаю, что исправить и, надеюсь, я вернусь с решением в ближайшее время;)

Я просто хочу добавить, что я закончил мой nativeSQL, добавив эти строки:

$rsm->addFieldResult('s', 'points', 'points'); 
    $rsm->addFieldResult('s', 'stats', 'stats'); 
    $rsm->addFieldResult('s', 'day', 'day'); 

но Безразлично Кажется, что пока работает, с таким внешним ключом, как игра $ rsm-> addMetaResult ('s', 'game_id', 'game');

Все еще работает над этим.

ответ

0

Этот тип запросов не будет работать в DQL.

У вас есть несколько вариантов:

а) использовать Doctrine DBAL вместо ОРМ. DBAL практически не отличается от работы с подготовленными операциями mysql. Результаты приходят в массиве, а не в объектах, как в ORM.

b) использовать Native SQL, где вы должны определить объекты и свойства, которые будут заполнены вручную.

+0

Спасибо! Я пошел на родной путь SQL, так как весь мой проект уже использует ORM. У меня есть работа, но у меня есть проблема с результатом моего следующего запроса. Я отредактирую основное сообщение с дополнительной информацией. –

+0

Может быть, вы можете добавить код, который использует собственные запросы –

+0

Привет, sry за то, что я не отвечал ранее, но я отсутствовал последние пару дней. Поэтому я выяснил, в чем проблема. Поскольку я только пытался получить «id» с моим собственным SQL, он каким-то образом сообщает symfony, что он принимает только идентификатор для следующего запроса. (Не уверен, что вы получите то, что я говорю.) В любом случае. Я исправил это, выбрав всю строку в родном SQL. Я обновлю сообщение как можно скорее –