代码之家  ›  专栏  ›  技术社区  ›  markus

Zend框架:如何取消设置Zend_Db_Table_Rowset对象中的数据行

  •  4
  • markus  · 技术社区  · 16 年前

    我想迭代存储在Zend_Db_Table_Rowset对象中的数据行,然后删除/取消设置一些不符合某些条件的行。

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

    我尝试了以下方法,但没有奏效:

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

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

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

    4 回复  |  直到 16 年前
        1
  •  6
  •   Ondrej Machulda    14 年前

    示例方法为您 custom rowset class :

    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!
    }
    

    它迭代您的行集,根据其id(假设“id”是唯一标识符)找到行,然后将其从行集中删除。

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

        2
  •  4
  •   David Snabel-Caunt    16 年前

    你可以使用 custom Rowset class

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

        3
  •  1
  •   smack0007    16 年前

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

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

    这不是最有效的方法,但它奏效了。

        4
  •  -2
  •   gmcrist    16 年前

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

    foreach ($rowset as $row)
    {
        if (!$condition == satisfied)
        {
           $row->delete();
        }
    }