2010-06-19 2 views
6

Я пытаюсь сделать группу с помощью рамки Zend. Вот мой код:Zend framework group

$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. Запрос хорошо сформирован. Column1 указан в запросе, и результаты выглядят корректно, если я запускаю запрос в workbench mysql.

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

Uncaught исключение «Zend_Db_Table_Row_Exception» с сообщением «Заданный столбец„column1“не в строке»

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

Я пробовал:

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

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

  • бросали в Zend_Db_Expr: "column1" => новый Zend_Db_Expr ("сумма (COLUMN1)") , но это не помогает.

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

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

ответ

8

Во-первых, быстрый совет для работы с 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` 
+0

Я попробовал ваш код, и я была такая же проблема, как и раньше, даже если он работает для вас. Это заставило меня подумать, что с моей настройкой что-то не так. Я использую Zend Studio 7.2 для разработки. Когда я запускаю либо ваш, либо мой код в PHP 5.2.10 в Zend Studio, я получаю проблемы, которые я изложил. Когда я запускаю код под PHP 5.3.0, у меня нет проблем. Возможно, PDO не работает так хорошо в PHP 5.2? Проблема решена - спасибо за вашу помощь Дэвид! – 2010-06-20 00:41:46

+0

Я проверил его с 5.3, но я обычно работаю под 5.2. Существуют некоторые проблемы mysql.dll, если вы используете MySQL 5.1 с PHP 5.2, но они обычно приводят к общему сбою! –

+0

Хорошее предложение по проверке SQL.I обнаруживает, что API-интерфейс Zend DB API часто генерирует фальшивый SQL, который не делает того, что вы ожидаете или может разумно хотеть (особенно, когда задействовано несколько объединений). У меня никогда не было этой проблемы с каким-либо другим API-интерфейсом DB, это единственное, что я делаю в Zend, я думаю, это действительно глючит. –