специальный запрос symfony/doctrine (MAX) с Doctrine_Query::create()

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

Хорошо, давайте приступим к делу прямо сейчас:

Table: a
primary key: id
string: name

Table: b
primary key: id
foreign key: a_id
int: cluster

Что я хочу сделать, так это получить максимальный кластер int для данного объекта a. В SQL:

SELECT MAX(b.cluster) FROM b WHERE b.a_id = ? GROUP BY b.cluster;

Поскольку я использую symfony 1.4 и доктрину 1.2, я хочу сделать это правильно, добавив метод в класс a с именем maxCluster():

class A extends BaseA{

  ..

  public function maxCluster(){
    $q = Doctrine_Query::create()->select('MAX(b.cluster)')->from('B b')->where('b.a_id = ?', $this->getId())->groupBy('b.cluster');
    return Doctrine_Core::getTable('A')->execute($q);
  }
}

При этом я получаю следующее сообщение об ошибке:

A query with the name A/SELECT MAX(b.cluster) FROM B b WHERE b.a_id = ? GROUP BY b.cluster does not exist.

Я думаю, что решение должно быть не таким уж сложным, я просто застрял прямо сейчас.

Спасибо за любую помощь, Себастьян

РЕДАКТИРОВАТЬ: я получил подсказку, поэтому знайте, что код функции maxCluster выглядит так:

$q = Doctrine_Query::create()->select('MAX(b.cluster) AS maxCluster')->from('B b')->where('b.a_id = ?', $this->getId())->;
$result = $q->fetchOne();
return $result->maxCluster;

Вопрос для меня прямо сейчас: это лучший способ? Меня смущает, что fetchOne возвращает массив изображений. Я бы не ожидал такого поведения, потому что я выбираю один int, а не объекты. Может быть, кто-нибудь может указать, что лучше всего подходит для таких запросов.


person Sgoettschkes    schedule 30.08.2011    source источник


Ответы (1)


Выполнение метона относительно getTable используется для выполнения именованных запросов, взгляните на руководство по доктрине, чтобы найти больше, если вы хотите их использовать.

Или вы можете использовать return $q->execute() для возврата результата запроса.

person Manuel    schedule 30.08.2011
comment
Спасибо за ваш ответ. Пожалуйста, смотрите мое редактирование выше: теперь оно работает, но я им не доволен. - person Sgoettschkes; 30.08.2011
comment
попробуйте использовать другой режим увлажнения: return $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR) - person Manuel; 30.08.2011
comment
Спасибо большое за подсказку, попробую! - person Sgoettschkes; 30.08.2011