Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308

    Zend Framework: Gestione tabelle gerarchiche

    Ciao a tutti,
    mi chiedevo se qualcuno è a conoscenza di un metodo completo per la gestione delle tabelle gerarchiche con Zend Framework.
    Grazie

  2. #2
    cosa intendi per tabelle gerarchiche?

  3. #3
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Tabelle ricorsive, dove un record può avere un padre e dei figli nella medesima tabella.

  4. #4
    non mi è molto chiaro il concetto...di solito in una tabella c'è un tipo di dati UNICO e si usano altre tabelle per "rintracciare" i dati correlati, ad esempio in una tabella clienti si inserisce l'ID del'ordine fatto e si recupera le informazioni del'ordine tramite l'ID dell'apposita tabella ordini...

  5. #5
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ho risolto..

    la rilettura di alcune sezioni che avevo sottovalutato della documentazione ufficiale mi hanno aiutato a capire http://framework.zend.com/manual/en/...b.select.html.

    spiego qui di seguito il problema che ho avuto in quanto penso che capiterà ad altri:
    per la gestione delle tabelle ricorsive ho creato una classe 'middleware' che estende Zend_Db_Table_Abstract, soluzione ideata principalmente da Hector Virgen nel suo sito
    http://www.virgentech.com/blogs/view/id/4.

    La sua soluzione è molto estesa, un po' troppo per ciò di cui avevo attualmente bisogno io, prendendo in considerazone il concetto di left e right values di un record. La sua classe è ottima ma non gestisce il ripristino di questi valori all'atto di eliminazione di un record.

    Ho pensato quindi di fare qualcosa di più 'classico', creando un metodo ricorsivo. Il problema è che il metodo deve accettare come argomento una istanza di Zend_Db_Select in modo tale da poter gestire eventuali join e filtri. Effettuando la ricorsione, il metodo 'where' di Zend_Db_Select appendeva il contenuto alla vecchia query e nessun dato veniva quindi estratto, questo è una prima versione, priva di controlli, del metodo in questione:

    Codice PHP:
          public function fetchDescendants($parent_idZend_Db_Select $select null){
            if (
    null === $select){
              
    $select $this->select();
            }else{
              
    $select $select;
            }
            
            
    // Ad ogni chiamata questi 'where' sono aggiunti alla query, 
            
    $select->where('b.language_id = ?'1)
            ->
    where($this->_parentKey ' = ?', (int) $parent_id);
            
    $rowset $this->fetchAll($select);
            
            
    //echo $select->__toString();
            
    if(count($rowset)>0){
              foreach(
    $rowset AS $k => $v){
                
    $this->traverse[] = $v;
                
    $this->fetchDescendants($v->{$this->primaryKey()},$select);
              }
            }
            return 
    $this->traverse;
          } 
    La soluzione arriva grazie all'utilizzo del metodo 'reset', che resetta una certa parte della query

    Codice PHP:
          public function fetchDescendants($parent_idZend_Db_Select $select null){
            if (
    null === $select){
              
    $select $this->select();
            }else{
              
    $select $select;
            }
            
           
    // in questo punto la clausola where viene resettata e reimpostata
            
    $select->resetZend_Db_Select::WHERE );
            
    $select->where('b.language_id = ?'1)
            ->
    where($this->_parentKey ' = ?', (int) $parent_id);
            
    $rowset $this->fetchAll($select);
            
            
    //echo $select->__toString();
            
    if(count($rowset)>0){
              foreach(
    $rowset AS $k => $v){
                
    $this->traverse[] = $v;
                
    $this->fetchDescendants($v->{$this->primaryKey()},$select);
              }
            }
            return 
    $this->traverse;
          } 

    In questo modo il metodo funziona.
    Questa non è la versione definitiva, l'ho pubblicata solo per chiarire di cosa stessi parlando, spero sia utile a qualcuno.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.