【问题标题】:Zend Framework 2 TableGateway wrong field mappingZend Framework 2 TableGateway 错误的字段映射
【发布时间】:2014-05-25 17:32:35
【问题描述】:

尝试调整 ZF2 skeleton application,结果集中检索到的字段有问题。 我的表“项目”包含四个字段: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->current());给出:

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

而 print_r($data);在 exchangeArray 函数中给出:

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

似乎该对象只正确获取了前两个字段,然后使用结果中可用的最后一列的值创建了一个字段 [project]。

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

【问题讨论】:

  • 我不认为这是导致您的问题的原因,但由于我从未见过这样使用它,您能否尝试将 !empty() 更改为官方文档建议的 $this- >id = (isset($data['id'])) ? $data['id'] : null;
  • 感谢您的建议。我试过了,没用,很遗憾。请注意,我正在使用的“官方文档”版本是提议 !empty(),而不是 isset():请参阅 framework.zend.com/manual/2.2/en/user-guide/…
  • 是的,你是对的。没有注意到 2.1 的变化。是否仍按年返回项目?
  • 很遗憾,没有变化。
  • 你能试试这样的原始查询吗? $adapter = $this->tableGateway->getAdapter(); //创建查询 $resultSet = $adapter->query("SELECT project.* FROM project",array()); //将对象转换为数组 $rowData=$resultSet->toArray();返回$行数据;只是看看你是否仍然得到相同的结果?

标签: php mysql zend-framework2


【解决方案1】:

请在 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());的结果。

【讨论】:

  • 感谢 Kunal,我粘贴了与您的完全匹配的工厂定义,并更正了您建议的 print_r 的结果。
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多