(Propel) Использование агрегатных функций

Anna2006
Дата: 14.10.2006 14:40:33
Нужно получить сумму всех значений колонки из таблицы в БД. Запрос должен быть таким:
select sum(COL1)
from Table
where COL2 = 1

В Propel:
$c = new Criteria();
$c->add(TablePeer::COL2,1);
$result=TablePeer::doSelect($c);

Насколько я знаю с помощью объекта Criteria можно повлиять только на WHERE часть в запросе.

А вот как описать, что мне нужна сумма?
Вариант получить сложить все значения из полученного массива $result не подходит (придётся тащить из базы тучу записей вместо одного числа, а таблица большая).

Может кто-то уже сталкивался с подобной задачей?
Alexey Lapusta
Дата: 15.10.2006 15:53:40
Да... Пропеллер это ещё тот неповоротлиый монстр. Насколько я знаю в текущей версии встроенных агрегатных функций нет, хотя в Trac вроде бы писали как это можно реализовать - но я просто для таких запросов использовал custom query.

    $con = Propel::getConnection();
    $sql = 'select sum(COL1) from Table where COL2 = 1';
    $st = $con->prepareStatement($sql);
    $rs = $st->executeQuery(ResultSet::FETCHMODE_ASSOC);

P.S. Symfony используете?)
Anna2006
Дата: 15.10.2006 19:54:34
Спасибо за совет.
Видимо придётся таки прямой SQL запрос писать.

P.S. Да, Symfony
Игорь П.
Дата: 10.01.2009 13:48:50
Всем привет!

Волею судеб оказался в проекте, где используется propel и symfony. Раньше с propel и symfony
не встречался. Поэтому вынужден не редко изобретать велосипеды и разбираться в азах обоих
библиотек :)
К сожалению, я единственный разработчик и связи с предшественниками нет.

Ладно, прерву свои жалобы на жизнь. Ей я, на самом деле, доволен :)

Вопрос в другом.
Мне необходимо выполнить довольно сложный запрос на MySQL.
Запрос написать не вопрос. Я его даже написал уже. Но вот как вызвать? :)
Если кто знает, подскажите, как через стандартные средства propel сделать запрос с UNION?
Или можно еще по другому подойти к этому всему...
Можно не мучить себя заполняя объект Criteria. Можно же и передать plain-SQL... но вот есть одно но
если я пишу код
$con = Propel::getConnection(DATABASE_NAME);
$sql = 'SELECT 1';
$stmt = $con->createStatement();
$rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);
То выдача от него отличается по своей структуре от того, что выдает
$details = zzzPeer::doSelect($objCriteria);

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

поэтому, есть ли метод, получить старую структуру данных, как это делает doSelect и передавать для выполнения этим самым doSelect вручную написанный мною запрос???

Спасибо!
Игорь П.
Дата: 10.01.2009 18:40:30
внесу поправку - в текущем коде, Criteria передается для использования не просто в doSelect,
а в sfPropelPager.

Еще раз спасибо!