Получить значения агрегированных столбцов в Propel - PullRequest
2 голосов
/ 04 декабря 2011

Я пытаюсь сделать следующий запрос в Propel:

$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(TableName::COLUMN1)
    ->addSelectColumn(TableName::COLUMN2)
    ->addAsColumn('alias1', 'DATE('.TableName::INIT_TIME.')')
    ->addAsColumn('alias2', 'COUNT('.TableName::DOWNLOAD_START_TIME.')')
    ->addGroupByColumn('DATE('.TableName::INIT_TIME.')')
    ->addGroupByColumn(TableName::DOWNLOAD_START_TIME);

$logs = TableName::doSelect($criteria);

Кажется, что все в порядке и в соответствии с запросом файла журнала MySQL генерируется и сохраняется на сервере право.Однако я не могу получить значения агрегированных столбцов.

doSelect возвращает массив объектов TableName, у которых нет методов для выборки агрегированных столбцов.Итак, как я могу это сделать?

PS: я говорю о Symfony 1.4 с Propel, если это имеет значение.

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Вам следует избегать использования Criteria, вместо этого используйте API ModelCriteria (документация доступна по адресу: http://www.propelorm.org/reference/model-criteria.html)

Следующий запрос:

<?php

$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(TableName::COLUMN1)
    ->addSelectColumn(TableName::COLUMN2)
    ->addAsColumn('alias1', 'DATE('.TableName::INIT_TIME.')')
    ->addAsColumn('alias2', 'COUNT('.TableName::DOWNLOAD_START_TIME.')')
    ->addGroupByColumn('DATE('.TableName::INIT_TIME.')')
    ->addGroupByColumn(TableName::DOWNLOAD_START_TIME);

$logs = TableName::doSelect($criteria);

Может быть переписанкак показано ниже:

$query = TableNameQuery::create()
    ->select(array('Column1', 'Column2'))
    ->withColumn('DATE(InitTime)', 'alias1')
    ->withColumn('COUNT(DownloadStartTime)', 'alias2')
    ->groupBy('alias1')
    ->groupByDownloadStartTime()
    ;
$logs = $query->find();

Обратите внимание, что вы не будете выбирать оба столбца alias1 и alias2, поскольку не добавили их в выбранные столбцы в своем коде.сделать это, добавив два псевдонима к предложению select():

    ->select(array('Column1', 'Column2', 'alias1', 'alias2'))
1 голос
/ 05 декабря 2011

Я использовал этот фрагмент для извлечения и извлечения данных, когда следовал этому же подходу, но выбрал только один столбец в моих criteria - addSelectColumn:

$logs = TableName::doSelectStmt($criteria); 
$data = $logs->fetchAll(PDO::FETCH_COLUMN, 0);

Надеюсь, это поможет вам.

0 голосов
/ 27 декабря 2011

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

        $stmt = self::doSelectStmt($c);

        // empty array for now
        $results = array();
        // lets iterate through this
        while($row = $stmt->fetch(PDO::FETCH_BOTH)) {
           // we need to create a new object
           $division = new Division();
           // and we'll hydrate each row turning into an object so we can use it easily
           $division->hydrate($row);
           // now here's the magic, this object did not exist from our tables, we'll fix that
           $division->setNumPlayers($row['num_players']);
           $division->setNumTeams($row['teams']);
           // set the output object
           $results[] = $division;
           } 
return $results; // array of objects including aggregate values
...