Doctrine Query вычисляет значение MAX в предложении WHERE - PullRequest
3 голосов
/ 19 декабря 2011

У меня есть эти таблицы:

подписчиков

id | name  |
---+-------+
1  | Hill  |
2  | Sam   |
3  | Joe   |

подписчиков_годов

subscriber_id | year  |
--------------+-------+
1             | 2009  |
1             | 2010  |
1             | 2011  |
2             | 2009  |
2             | 2010  |
3             | 2010  |

Я хочу выполнить расширенный поиск, используя только записикоторые имеют максимум как х.Если x = 2010 Результаты запроса должны быть: Сэм и Джо!

Я пытаюсь это:

$query = $this->createQuery('su')
            ->select('su.id, su.name)
            ->addWhere(
                '(SELECT MAX(year) AS maxYear FROM `subscribers_years` WHERE `subscriber_id`=`su.id`) = ?',
                2010
            );

, но у меня появляется сообщение об ошибке: Сообщение: не удалось найти класс subscribers_years

как правильно написать свой запрос?


Решение

$query->addWhere('(SELECT MAX(year) AS maxYear FROM SubscriberYear WHERE subscriber_id=su.id) = ?', 2010 );

Моя ошибка заключалась в том, что я не использовал имя класса Doctrine в качестве From, ноиспользовал имя таблицы mysql!: S

Ответы [ 2 ]

2 голосов
/ 01 сентября 2012

Я думаю, что лучший способ пойти сюда - это использовать createSubquery(), чтобы явно рассказать доктрине о подзапросе, а затем вложить ее в условие where.Шаблон довольно прост и может быть использован для любой сложности.Ваш запрос должен выглядеть примерно так:

$query = $this->createQuery('su')
    ->select('su.id, su.name)
;

$subquery = $query->createSubquery()
    ->select("MAX(year) AS maxYear")
    ->from("SubscriberYear")
    ->where("subscriber_id=su.id")
;

$query->addWhere($subquery->getDql().' = ?', 2010 );

Вот еще один пример создания подзапросов:

http://www.philipphoffmann.de/2012/08/taming-doctrine-subqueries/

2 голосов
/ 19 декабря 2011

У вас не может быть простого SQL в ваших подзапросах доктрины.У вас есть два варианта:

  1. Использовать имя модели для subscribers_years таблицы в вашем подзапросе
  2. Использовать RAW SQL в вашем запросе.

Если вам не нужен какой-либо продвинутый SQL, я бы выбрал вариант 1, так как в нем меньше SQL, и вам не нужно указывать условия соединения, в противном случае вы должны использовать 2.

Вы всегда можете добавить класс Doctrine для вашего subscribers_years, если у вас его нет.

...