【问题标题】:Zend Framework: How to unset data rows in a Zend_Db_Table_Rowset objectZend 框架:如何取消设置 Zend_Db_Table_Rowset 对象中的数据行
【发布时间】:2009-04-18 15:39:27
【问题描述】:

我想迭代存储在 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() [/编辑]

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用custom Rowset class

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

      【讨论】:

      • 我最终做了我认为我做不到的事情,这意味着我将所有内容都集成到了查询中。但是感谢自定义行集输入,我肯定会在某一时刻需要它。
      【解决方案3】:

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

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

      这不是最有效的做法,但它确实有效。

      【讨论】:

      • 不,我需要对象健康。使用 $rowset->toArray() 可以轻松创建数组
      • $rowset->toArray() 不会产生行对象。它将整个行集作为数组返回。这就是我没有使用它的原因。
      • 上面的自定义行集类可能是你最好的选择。
      【解决方案4】:

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

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

      【讨论】:

      • 删除是破坏性的。该行将从表中删除。
      • 可能我不是很清楚但是我不想从表中删除该行,我只想从对象中删除它!!
      • 请接受我不理解您想要做什么的歉意。正如 dcaunt 建议和 smack0007 所确认的那样,使用自定义行集将是最佳选择。
      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多