Zend Framework 2 TableGateway字段映射错误


Zend Framework 2 TableGateway wrong field mapping

尝试适应ZF2骨架应用程序,我在resultSet中检索字段时遇到了麻烦。我的表project包含四个字段:id、title、shortTitle、year。我使用的是典型的fetchAll函数:

public function fetchAll() {
    $resultSet = $this->tableGateway->select();
    return $resultSet;
}
Project类反映了四个字段
class Project {
    public $id;
    public $title;
    public $shortTitle;
    public $year;
  public function exchangeArray($data) {
      $this->id = (!empty($data['id'])) ? $data['id'] : null;
      $this->title = (!empty($data['title'])) ? $data['title'] : null;
      $this->shortTitle = (!empty($data['shortTitle'])) ? $data['shortTitle'] : null;
      $this->year = (!empty($data['year'])) ? $data['year'] : null;
  }
} 

Module.php中的表网关工厂如本教程所述:

public function getServiceConfig() {
        return array(
            'factories' => array(
                'Project'Model'ProjectTable' => function($sm) {
                    $tableGateway = $sm->get('ProjectTableGateway');
                    $table = new ProjectTable($tableGateway);
                    return $table;
                },
                'ProjectTableGateway' => function($sm) {
                    $dbAdapter = $sm->get('Zend'Db'Adapter'Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Project());
                    return new TableGateway('project', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }

传递给数据库的查询是正确的,并给出正确的结果:

SELECT `project`.* FROM `project` 

$resultSet看起来好像得到了正确的原型和正确的行数,但它没有正确匹配列名。print_r ($ resultSet ->当前());给:

Project'Model'Project Object ( [id] => 1 [title] => Some title 1 
      [shortTitle] => [year] => )

而print_r(元数据);在exchangeArray函数给出:

Array ( [id] => 1 [title] => Some title 1 [project] => 2012 )

对象似乎只得到前两个字段的权利,然后创建一个字段[project],最后一列的值在结果中可用。

我一定是在什么地方犯了一个愚蠢的错误,但我不知道在哪里。谢谢。

请在Module.php中检查您的TableGateway工厂-它应该类似于此-

也需要use ...语句。

use Zend'Db'ResultSet'ResultSet;
use Zend'Db'TableGateway'TableGateway;
use [.....]'Model'Product;          //Add the Module Name here
use [.....]'Model'ProductTable;     //Add the Module Name here
'Project'Model'ProjectTable' => function($sm) { //Change Module name accordingly.
    $tableGateway = $sm->get('ProjectTableGateway');
    $table = new ProjectTable($tableGateway);
    return $table;
},
'ProjectTableGateway' => function ($sm) {
    $dbAdapter = $sm->get('Zend'Db'Adapter'Adapter');
    $resultSetPrototype = new ResultSet();
    $resultSetPrototype->setArrayObjectPrototype(new Project());
    return new TableGateway('project', $dbAdapter, null, $resultSetPrototype); 
    //Change the the tablename accordingly.
},

然后在你的问题描述中添加print_r($resultSet->current());的结果。