【问题标题】:Zend_Db_Table_Rowset to array of objectsZend_Db_Table_Rowset 到对象数组
【发布时间】:2012-06-24 18:21:33
【问题描述】:

我不是在寻找$myRowset->toArray();,因为我想获得一个对象数组

我想做的是能够将$myRowset 与对象数组合并。

$myOtherArray = [new Foo(), new Bar()];
$array = array_merge($myRowset, $myOtherArray);

使用 Zend_Db_Table_Rowset,这是不可能的。使用$myRowset->toArray(); 也不起作用,因为我需要一个对象数组。

编辑 - 执行我想要的代码示例,但如果存在,我正在寻找更好的解决方案:

// Convert the Zend_Db_Table_Rowset to an array of Zend_Db_Table_Row
$myRowset = $dbTable->fetchAll();
$rowArray = array();
foreach ($myRowset as $row) {
    $rowArray[] = $row;
}

// Merge with other array of objects
$myOtherArray = [new Foo(), new Bar()];

$finalArray = array_merge($rowArray, $myOtherArray);

【问题讨论】:

  • 我不确定 Zend 应该如何知道您想从数据库返回的数据中实例化哪个对象。除了遍历数组并自己实例化每个对象之外,我认为您想要的东西是不可能的,除非您所说的对象只是指您可以通过将数组转换为对象来制作的 stdClass 对象。但你真的不想这样做,原因有很多。
  • @GordonM 不需要实例化任何东西,查询返回的行集包含Zend_Db_Table_Row 的子类型(我的模型对象)。请参阅我的编辑以更好地理解。
  • 我认为您已经拥有的解决方案几乎是您唯一的选择。您可以使用一种方法扩展 Zend_Db_Table_Rowset 以返回行数组以使其更易于管理,但仅此而已。
  • 为什么不用zend fetch模式呢? framework.zend.com/manual/1.12/en/… 如果您要执行 $db->setFetchMode(Zend_Db::FETCH_OBJ);,那么之后的任何 fetchAll() 语句都将返回一个对象数组...

标签: php arrays zend-framework zend-db zend-db-table


【解决方案1】:

这是我“最干净”的解决方案:我覆盖 Zend_Db_Table_Rowset

class My_RowSet extends Zend_Db_Table_Rowset {

    public function rowArray() {
        $rowArray = array();
        foreach ($this as $row) {
            $rowArray[] = $row;
        }
        return $rowArray;
    }

}

和 Zend_Db_Table:

abstract class My_Db_Table extends Zend_Db_Table {

    protected $_rowsetClass = 'My_RowSet';

}

现在我可以做:

$myRowset = $dbTable->fetchAll();
$rowArray = $myRowset->rowArray();

【讨论】:

  • 不像我希望的那么简单,但在我看来仍然足够干净,可以使用,谢谢
【解决方案2】:

你可以使用

/** @var Zend_Db_Table_Row[] $rows */
$rows = iterator_to_array($rowset)

【讨论】:

猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2017-11-12
  • 2012-07-02
  • 2020-11-15
  • 2011-01-10
相关资源
最近更新 更多