ZF2:TableGateway ResultSet 到 JSON

Posted

技术标签:

【中文标题】ZF2:TableGateway ResultSet 到 JSON【英文标题】:ZF2: TableGateway ResultSet to JSON 【发布时间】:2014-11-29 10:14:02 【问题描述】:

我正在尝试将数据从我的数据库返回到 Zend Framework 2 中的 JSON。我现在正在使用 TableGateway,它返回一个 ResultSet。但是 JsonModel 无法显示结果集。 那么有没有办法转换它,或者有没有其他方法可以访问我的数据库?

HomeController 中的 IndexAction

public function indexAction()

    return new JsonModel(array(
        'posts' => $posts,
        'resources' => $resources,
        'style' => $style,
        'imgStyle' => $imgStyle,
        'success' => true,
    ));

返回结果集的函数

public function fetchAll()

    $resultSet = $this->tableGateway->select(function (Select $select) 
        $select->order('date DESC');
    );
    return $resultSet;

【问题讨论】:

【参考方案1】:

考虑到您已经在 module.config.php 中完成了这项工作:

'view_manager' => array(
    'strategies' => array(
        'ViewJsonStrategy',
    ),
),

我的下一个建议是将结果转换为数组。

$resultSet->toArray();

$return = array();

foreach( $resultSet as $r )
    $return[]=$r;

你返回的新JsonModel,是正确的。

【讨论】:

toArray() 不起作用,所以我手动将其转换为数组! 是的,事实上,如果你将 toArray 提取到一个类中,它会失败,不知道为什么,让函数 toArray() 始终工作会很有用:),我相信 zf2 开发人员可能这样做有充分的理由。【参考方案2】:

您可以在fetchAll 方法或Controller 中使用Zend\Stdlib\Hydrator\Reflection-hydrator:

public function __construct(\Zend\Stdlib\Hydrator\Reflection $hydrator)

    $this->hydrator = $hydrator;


public function fetchAll() : array 

    $resultSet = $this->tableGateway->select(function (Select $select) 
        $select->order('date DESC');
    );
    $return = [];
    foreach($resultSet as $result) 
        $return[] = $this->hydrator->extract($result);
    
    return $return;

【讨论】:

以上是关于ZF2:TableGateway ResultSet 到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 TableGateway ZF2/ZF3 编写类测试

使用 zend 2 的 tableGateway 进行插入

ZF2 - 使用 Ajax 填充选择

ZF2 - 迭代 HydratingResultSet

关于ServiceLocator ,AdpaterAwareInterface 注入

存储过程zend framework 2.2 tablegateway中的多选问题