Zend Framework группа по - PullRequest
6 голосов
/ 19 июня 2010

Я пытаюсь создать группу, используя Zend Framework.Вот мой код:

$table = new TableClass();
$select = $table->select();
$select->from ("table", array("date", "column1" => "sum(column1)"));
$select->group ( array ("date") );
$results = $table->fetchAll ($select);
$result = $results[0];
$date = $result->date;
$column1 = $result->column1;

TableClass расширяет Zend_Db_Table_Abstract '.

Я могу увидеть запрос, просмотрев журнал запросов mysql.Запрос правильно сформирован - столбец1 назван в запросе, и результаты выглядят корректно, если я выполню запрос в MySQL Workbench.

Я не могу получить доступ к данным в 'column1' - я всегда получаю это исключение:

Необработанное исключение 'Zend_Db_Table_Row_Exception' с сообщением 'Указанный столбец "column1" отсутствует в строке "

Однако я могу получить доступ к столбцу даты без проблем.

Я пытался:

  • доступ к столбцам по индексу массива: $ result [0], но вы получаете исключение (не можете получить доступ к столбцам по индексу).

  • без использования псевдонима столбца: $ select-> from ("таблица", массив ("дата", "сумма (column1)"));$ column1 = $ result ["sum (column1)"];но вы получаете исключение (нет такого столбца "sum (column1)").

  • , добавив Zend_Db_Expr: "column1" => new Zend_Db_Expr ("sum (column1)"), ноэто не помогает.

Некоторые другие примеры, которые я видел, предлагают использовать имена столбцов без агрегатных функций, т.е.«column1» вместо «sum (column1)», но мне это не кажется ответом - в запросе нет агрегатных функций, поэтому mysql не будет знать, что с ним делать.

Любая помощь приветствуется.

1 Ответ

8 голосов
/ 19 июня 2010

Во-первых, быстрый совет по работе с Zend_Db_Select (и расширением Zend_Db_Table_Select), вы можете просмотреть сгенерированный SQL, вызвав метод toString. Важно убедиться, что ваш код генерирует правильный запрос, прежде чем работать с набором результатов:

$select = $table->select();
$select->from ("table", array("date", "column1" => "sum(column1)"));
$select->group ( array ("date") );

$sql = (string) $select; //Retrieve SQL as a string

Или просто

die($select); //print SQL

Я написал следующий тестовый скрипт на вашем примере, и у меня нет проблем:

class Table extends Zend_Db_Table_Abstract 
{
    protected $_primary = 'id';
    protected $_name = 'table';
}

$db = Zend_Db::factory('Pdo_Mysql', array(
    'dbname' => 'test',
    'username' => 'root',
    'password' => '',
    'host' => 'localhost'
));

$table = new Table($db);

$select = $table->select();
$select->from ($table, array("date", "column1" => new Zend_Db_Expr("sum(column1)")));
$select->group ( array ("date") );
$sql = (string) $select;

echo $sql;

$results = $table->fetchAll ($select);
$result = $results[0];
$date = $result->date;
$column1 = $result->column1;

echo '<br>' . $date . ': ' . $column1;

Использовать Zend_Debug :: dump ($ result); при необходимости проверить данные внутри Zend_Db_Table_Row.

В моем случае сгенерированный SQL выглядит следующим образом:

SELECT `table`.`date`, sum(column1) AS `column1` FROM `table` GROUP BY `date`
...