4

我想迭代存储在 Zend_Db_Table_Rowset 对象中的数据行,然后删除/取消设置某些行,如果它们不满足某些条件。

我可以使用 toArray() 仅从对象中获取数据行,然后很容易取消设置我不需要的行。但由于我想保留我的对象以供进一步使用,我不想这样做。

当然,一种解决方案是调整我的查询以便只检索我需要的内容,但在这种情况下这是不可能的。至少我不知道怎么做。

我尝试了以下不起作用:

foreach ($rowset as $key => $row)
{
    if (!$condition == satisfied)
    {
        unset($rowset[$key]);
    }
}

当然它不起作用,因为没有 $rowset[$key]... 数据存储在子数组 [_data:protected] 但未设置 $rowset[_data:protected][$key] 没有工作。

也许我对行集对象(或一般对象的表示)的概念还不够成熟,无法理解我在做什么。欢迎任何澄清和提示!

[编辑] $row->delete 不是一个选项,我不想从数据库中删除该行!我不想先创建一个数组,如果我想我会做 $rowset->toArray() [/EDIT]

解决方案:我最终做了我认为我做不到的事情,这意味着我将所有内容都集成到了初始查询中。

4

4 回答 4

6

自定义行集类的示例方法:

public function removeFromRowset($id) {
    foreach ($this->_rows as $i => $v) {
        if ($v->id == $id) { // found Row we want to remove
            unset($this->_rows[$i]); // delete both rowset
            unset($this->_data[$i]); // and original data
            break; // not necessary to iterate any more
        }
    }
    $this->_data = array_values($this->_data); // reindex both arrays (otherwise it breaks foreach etc.)
    $this->_rows = array_values($this->_rows);
    $this->_count = count($this->_data); // don't forget to update items count!
}

它遍历您的 Rowset,根据其 id 找到 Row(假设“id”是唯一标识符),然后将其从 Rowset 中删除。

请注意,这不会从数据库中删除行,它只是将其从行集中删除!

于 2011-06-13T21:30:14.183 回答
4

您可以使用自定义 Rowset 类

然后,此类将有权访问内部存储的受保护 $_rows,并且您可以添加一个公共方法来应用您的过滤

于 2009-04-18T21:38:36.913 回答
1

我不知道有没有办法做到这一点。您可以先创建一个数组,然后修改该数组。

$rows = array();
foreach($rowset as $row)
{
     $rows[$row->id] = $row;
}

foreach ($rows as $key => $row)
{
     if(!$condition == satisfied)
     {
         unset($rows[$key]);
     }
}

不是最有效的事情,但它确实有效。

于 2009-04-18T17:41:04.613 回答
-2

您还可以对单个行对象使用 delete() 方法。

foreach ($rowset as $row)
{
    if (!$condition == satisfied)
    {
       $row->delete();
    }
}
于 2009-04-18T17:48:14.720 回答