2009-04-18 16 views
4

Je voudrais parcourir les lignes de données stockées dans un objet Zend_Db_Table_Rowset, puis supprimer/supprimer certaines lignes si elles ne remplissent pas certains critères.Zend Framework: Comment supprimer les lignes de données dans un objet Zend_Db_Table_Rowset

Je pourrais utiliser toArray() pour obtenir uniquement les lignes de données de l'objet et il serait alors facile de supprimer les lignes dont je n'ai pas besoin. Mais puisque je veux garder mon objet pour un usage ultérieur, je ne veux pas le faire.

Bien sûr, une solution serait d'ajuster ma requête afin de récupérer uniquement ce dont j'ai besoin, mais ce n'est pas possible dans ce scénario. Au moins, je ne saurais pas comment.

J'ai essayé les éléments suivants qui ne fonctionne pas:

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

Et bien sûr, cela ne fonctionne pas, car il n'y a pas $ rowset [$ key] ... les données sont stockées dans un sous-tableau [_data: protected] mais non défini $ rowset [_data: protected] [$ key] ne fonctionnait pas non plus. Peut-être que ma conception d'un objet rowset (ou la représentation d'objets en général) n'est pas assez mature pour comprendre ce que je fais. Toute clarification et conseils seraient les bienvenus!

[EDIT] $ row-> delete N'EST PAS une option, je ne veux pas supprimer la ligne de la base de données! Je ne veux pas créer un tableau d'abord, si je voulais, je voudrais juste faire $ rowset-> toArray() [/ EDIT]

Solution: J'ai fini par faire ce que je pensais que je n » étais pas t aussi, ce qui signifie que j'ai tout intégré dans la requête initiale.

Répondre

4

Vous pouvez utiliser un custom Rowset class

Cette classe aurait alors l'accès aux protégés _rows $ stockés en interne, et vous pouvez ajouter une méthode publique pour l'application de votre filtrage

+0

J'ai fini par faire ce que je pensais ne pas pouvoir aussi, ce qui signifie que j'ai tout intégré dans la requête. Mais merci pour l'entrée de jeu de lignes personnalisé dont je vais certainement avoir besoin à un moment donné. – markus

1

Je ne sais pas s'il existe un moyen de le faire. Vous pouvez d'abord créer un tableau, puis modifier le tableau.

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

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

Pas la chose la plus efficace à faire mais cela fonctionne.

+0

non, j'ai besoin de l'objet pour être en bonne santé. et créer un tableau devient facile avec $ rowset-> toArray() – markus

+0

$ rowset-> toArray() ne produit pas d'objets row. Il renvoie l'ensemble de lignes entier en tant que tableau. C'est pourquoi je ne l'ai pas utilisé. – smack0007

+0

La classe de jeu de lignes personnalisée ci-dessus est probablement votre meilleur pari. – smack0007

-2

Vous pouvez également utiliser la méthode delete() sur l'objet ligne individuel.

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

supprimer est destructeur. La ligne sera supprimée de la table. –

+0

peut-être que je n'étais pas clair mais je ne veux pas supprimer la ligne de la table, je veux juste l'enlever de l'objet !! – markus

+0

Veuillez accepter mes excuses pour ne pas comprendre ce que vous vouliez faire. Comme dcaunt suggéré, et smack0007 affirmé, l'utilisation d'un ensemble de lignes personnalisées serait la meilleure option. – gmcrist

6

méthode Exemple pour votre 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! 
} 

It itérer à travers votre Rowset, trouve Row en fonction de son id (en supposant que "id" est unique iden tifier) ​​et que de l'enlever du Rowset.

Veuillez noter que cela ne supprime pas la ligne de la base de données, elle la supprime simplement du Rowset!

+0

Très bien. Je vous remercie. – slik