2010-06-19 3 views
6

젠드 프레임 워크를 사용하여 그룹을 만들려고합니다. 내 코드는 다음과 같습니다.젠드 프레임 워크 그룹 by

$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; 

표 클래스가 'Zend_Db_Table_Abstract'로 확장되었습니다.

mysql 쿼리 로그를보고 쿼리를 볼 수 있습니다. 쿼리가 잘 형성되었습니다 - column1은 쿼리에 이름이 붙여지고 mysql 워크 벤치에서 쿼리를 실행하면 결과가 올바르게 표시됩니다.

내가 '컬럼 1'의 데이터에 액세스 할 수 - 난 항상이 예외를 얻을 :

메시지

catch되지 않은 예외 'Zend_Db_Table_Row_Exception'

'열', 컬럼 "지정은 행에없는 '그러나 나는 할 수 문제없이 날짜 열에 액세스하십시오.

나는 시도 : 배열 인덱스로 열에 액세스

  • : $ [0] 하지만 예외 (인덱스 컬럼을 액세스 할 수 없습니다) 얻을 결과.

  • 열 별칭을 사용하지 않음 : $ select-> from ("table", array ("date", "sum (column1)"))); $ column1 = $ result [ "sum (column1)"]; 하지만 예외가 발생합니다 (해당 열 "sum (column1)"없음). Zend_Db_Expr에 던지는

  • : ", 컬럼"=> 새로운 Zend_Db_Expr ("합 (1 열)을") 하지만 도움이되지 않습니다.

필자가 보았던 몇 가지 다른 예는 집계 함수가없는 열 이름의 사용을 제안합니다. "sum (column1)"대신 "column1"을 사용하지만 답변이 아닌 것 같습니다. 쿼리에 집계 함수가 없으므로 mysql이 처리 할 작업을 알지 못합니다.

도움을 주시면 감사하겠습니다.

답변

8

먼저 Zend_Db_Select (및 확장 Zend_Db_Table_Select) 작업에 대한 빠른 팁은 toString 메소드를 호출하여 생성 된 SQL을 볼 수 있습니다.

$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 :: 덤프 ($ 결과); 필요한 경우 Zend_Db_Table_Row 내부의 데이터를 검사합니다. 내가 코드를 시도하고 내가 당신을 위해 작동에도 불구하고 이전과 같은 문제가 없었다

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

다음과 같이 SQL 생성 내 경우

이다. 내 설정에 문제가 있다고 생각하게 만들었습니다. Zend Studio 7.2를 사용하고 있습니다. PHP 5.2에서 귀하 또는 귀하의 코드를 실행할 때.10 Zend Studio에서 내가 설명한 문제가 발생합니다. PHP 5.3.0에서 코드를 실행할 때 아무 문제가 없습니다. 요즘 PDO가 PHP 5.2에서 잘 작동하지 않을 수도 있습니다. 문제가 해결되었습니다 - 데이빗에게 도움을 주셔서 감사합니다! –

+0

5.3으로 테스트했지만 일반적으로 5.2에서 작동합니다. PHP 5.2에서 MySQL 5.1을 사용하고 있다면 mysql.dll과 관련된 몇 가지 문제가 있지만 일반적으로 전체 오류가 발생합니다! –

+0

SQL을 확인하기위한 좋은 제안입니다. Zend DB API의 *는 종종 기대하는 것 또는 합리적으로 필요한 것 (특히 여러 조인이 관련된 경우)을 수행하지 않는 가짜 SQL을 생성합니다. 나는 다른 DB API와 관련하여이 문제를 결코 경험하지 못했습니다. Zend에서 유일하게 버그가 있다고 생각합니다. –