Я работаю над 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');
Все еще работает над этим.
Спасибо! Я пошел на родной путь SQL, так как весь мой проект уже использует ORM. У меня есть работа, но у меня есть проблема с результатом моего следующего запроса. Я отредактирую основное сообщение с дополнительной информацией. –
Может быть, вы можете добавить код, который использует собственные запросы –
Привет, sry за то, что я не отвечал ранее, но я отсутствовал последние пару дней. Поэтому я выяснил, в чем проблема. Поскольку я только пытался получить «id» с моим собственным SQL, он каким-то образом сообщает symfony, что он принимает только идентификатор для следующего запроса. (Не уверен, что вы получите то, что я говорю.) В любом случае. Я исправил это, выбрав всю строку в родном SQL. Я обновлю сообщение как можно скорее –