Zend Framework: как удалить строки данных в объекте Zend_Db_Table_Rowset - PullRequest
4 голосов
/ 18 апреля 2009

Я бы хотел перебрать строки данных, хранящиеся в объекте Zend_Db_Table_Rowset, а затем удалить / сбросить некоторые строки, если они не соответствуют определенным критериям.

Я мог бы использовать toArray (), чтобы получить только строки данных от объекта, и тогда было бы легко сбросить ненужные мне строки. Но так как я хочу сохранить свой объект для дальнейшего использования, я не хочу этого делать.

Конечно, одним из решений было бы настроить мой запрос, чтобы получить только то, что мне нужно, но в этом случае это невозможно. По крайней мере, я не знаю, как.

Я попробовал следующее, которое не сработало:

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

И, конечно, это не работает, так как нет $ rowset [$ key] ... данные хранятся в подмассиве [_data: protected], но сброшено $ rowset [_data: protected] [$ key] тоже не работал.

Может быть, моя концепция объекта набора строк (или представление объектов в целом) недостаточно развита, чтобы понять, что я делаю. Любые разъяснения и советы приветствуются!

[EDIT] $ row-> delete - это НЕ опция, я не хочу удалять строку из базы данных! Я не хочу сначала создавать массив, если бы я хотел, я бы просто сделал $ rowset-> toArray () [/ EDIT]

Решение : Я закончил тем, что делал то, что, как мне показалось, тоже не смог, то есть все интегрировал в первоначальный запрос.

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

Пример метода для вашего пользовательского класса набора строк :

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, находит Row по его идентификатору (предположим, «id» является уникальным идентификатором) и затем удаляет его из Rowset.

Обратите внимание, что эта строка не удаляется из базы данных, она просто удаляется из набора строк!

4 голосов
/ 19 апреля 2009

Вы можете использовать пользовательский класс Rowset

Затем этот класс будет иметь доступ к защищенным $ _rows, хранящимся внутри, и вы сможете добавить открытый метод для применения вашей фильтрации

1 голос
/ 18 апреля 2009

Я не знаю, что есть способ сделать это. Вы можете сначала создать массив, а затем изменить массив.

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

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

Не самая эффективная вещь, но она работает.

0 голосов
/ 18 апреля 2009

Вы также можете использовать метод delete () для отдельного объекта строки.

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