findDependentRowset e join tra tabelle

Ciao a tutti, ho due tabelle strutturate in questa maniera.

Organizzazione:

- org_id (key)

- org_rag_sociale

Esercizi:

- esr_id (key)

- esr_nome

- esr_comune

- org_id (che punta ad organizzazioni)

Voglio effettuare una query che mi restituisca i campi esr_id, esr_nome, esr_comune, org_rag_sociale facendo un join sul campo org_id.

Ho creato una classe per organizzazioni:

class Application_Model_DbTable_Organizzazioni extends Zend_Db_Table_Abstract
{
    protected $_name = 'organizzazioni';
    
    protected $_dependentTables = array('Application_Model_DbTable_Esercizi');
}

e una per esercizi:

class Application_Model_DbTable_Esercizi extends Zend_Db_Table_Abstract
{
    protected $_name = 'esercizi';
    
   protected $_referenceMap = array(
        'Organizzazione' => array(                                     
        'columns' => array('org_id'),  
        'refTableClass' => 'Application_Model_DbTable_Organizzazioni',             
        'refColumns'  => array('org_id')));
}

Adesso uso il metodo findDependentRowset per ottenere un rowSet;

$esercizi = new Application_Model_DbTable_Esercizi(); // istanzio la classe esercizi
$organizzazioni = new Application_Model_DbTable_Organizzazioni();  // istanzio la classe organizzazioni
$rowSet = $organizzazioni->fetchRow('org_id = 234');  //condizione where
$eseOrg = $rowSet->findDependentRowset($esercizi);

Andando successivamente a stampare il contenuto del rowSet $eseOrg mi accorgo che vi sono solo campi della tabella esercizi (esr_*) mentre non ci sono quelli della tabella organizzazioni (org_*).

Qualcuno saprebbe aiutarmi a risolvere questo problema?

Grazie

inviato 6 anni fa
uastasi
X 0 X

E' giusto che si comporti così. Con findDependentRowset() non fai un reale join fra le tabelle.

Con questo metodo ritrovi praticamente i campi presenti nella tabella associata alla tupla precedentemente ricercata nella tabella genitore.

Forse quello che ti interessa lo ottieni con findManyToManyRowset().

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Da ciò che leggo sulla documentazione ufficiale e dal libro Zend Framework in Action il metodo findManyToManyRowset necessita di tre tabelle, di cui una di collegamento. Questo non è il mio caso, visto che sono solo due.

Ho provato il metodo select ma il risultato non cambia: stampando ogni riga del rowset ottengo solo i valori relativi alla tabella esercizi:

public function ottieniEseOrg()
   {
      
      $select = $this->select()
      ->from(array( 'e' => 'esercizi'))
      ->join(array('o' => 'organizzazioni'),
            'o.org_id = e.org_id', array());
                
      $result = $this->fetchAll($select);
      $result = $result->toArray();
      foreach($result as $row){
            echo '<br>Esr_id:'.$row[esr_id];   //OK
            echo '<br>Esr_nome:'.$row[esr_nome];  //OK   
            echo '<br>Esr_comune:'.$row[esr_comune];    //OK
            echo '<br>Org_rag_sociale:'.$row[org_rag_sociale];  //NO   
      }   
   }
risposto 6 anni fa
uastasi
X 0 X

Il secondo metodo non funzionava poichè istanziavo un oggetto di tipo Application_Model_DbTable_Esercizi in cui andare a mettere il risultato della funzione ottieniEseOrg(), perciò mi visualizzava solo i campi relativi alla tabella esercizi.

A questo punto mi chiedo in che tipo di oggetto dovrei metterlo affinchè vengano caricati tutti i campi.

risposto 6 anni fa
uastasi
X 0 X

La funzione ottieniEseOrg in quale model l'hai messa?

Mettila nel model che preferisci, elimina la parte di output (da demandare alla tua view) e poi istanzi l'oggetto nel tuo controller e richiami il metodo ottieniEseOrg.

Può essere una soluzione o altrimenti crei un terzo oggetto figlio dei due oggetti che hai già creato.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

La funzione ottieniEseOrg in quale model l'hai messa?

Mettila nel model che preferisci, elimina la parte di output (da demandare alla tua view) e poi istanzi l'oggetto nel tuo controller e richiami il metodo ottieniEseOrg.

Le stampe erano lì solo per prova, visto che ne ho tentate tante :)

La funzione l'ho messa nel model Esercizi. Ho poi istanziato Application_Model_DbTable_Esercizi nel controller, non ottenendo i campi relativi all'altra tabella.

Può essere una soluzione o altrimenti crei un terzo oggetto figlio dei due oggetti che hai già creato.

Cosa intendi per oggetto figlio?

Ho anche pensato ad una vista sul db, che funziona però solo in lettura: non potrei quindi andare a fare operazioni di scrittura, perciò devo scartare questa alternativa  :(

risposto 6 anni fa
uastasi
X 0 X

Per figlio intendo che fai una classe derivata.

Il tuo metodo come l'hai scritto adesso? Come fai l'output dei dati?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Per figlio intendo che fai una classe derivata.

Il tuo metodo come l'hai scritto adesso? Come fai l'output dei dati?

Forse ho capito, intendi dire una classe che estende Zend_Db_Table_Row_Abstract? Ho provato l'approccio ma non ci ho capito granché.

Comunque sia grazie all'aiuto di un utente italiano di Zend ho risolto in questo modo che vado ad illustrare nel caso potesse essere utile anche ad altri.

1) Ho creato una funzione nel model Esercizi così strutturata:

class Application_Model_DbTable_Esercizi extends Zend_Db_Table_Abstract
[...]
public function ottieniEsercizi(){
      $select = $this->select()->setIntegrityCheck(false);
      $select->from(array("esercizi"),
      array(
         'esercizi.esr_id',
             'esercizi.esr_nome',
             'esercizi.esr_comune',
         ))
      ->joinLeft(array( "organizzazioni"),"esercizi.org_id = organizzazioni.org_id ",
      array(
         'organizzazioni.org_id',
             'organizzazioni.org_rag_sociale'
          ));
          $rowset = $this->fetchAll($select);
          return $rowset;
   }

2) Ho istanziato il model Esercizi nell' EsercizioController e richiamato la funzione ottieniEsercizi che passo alla view per la visualizzazione:

$esercizi = new Application_Model_DbTable_Esercizi();
$this -> view -> esercizi = $esercizi->ottieniEsercizi();

3) Infine, ho fatto stampare nella view il rowset con un foreach in questo modo:

<?php foreach ($this->esercizi as $row) : ?>
<tr>
<td><?php echo $this->escape($row->esr_codice); ?></td>
<td><?php echo $this->escape($row->esr_denominazione); ?></td>
<td><?php echo $this->escape($row->esr_indirizzo); ?></td>
<td><?php echo $this->escape($row->esr_comune); ?></td>
<td><?php echo $this->escape($row->esr_cap); ?></td>
<td><?php echo $this->escape($row->org_rag_sociale); ?></td>
<td><?php echo $this->escape($row->esr_indirizzo); ?></td>
</tr>
<?php endforeach; ?>
risposto 6 anni fa
uastasi
X 0 X

No con figlio intendevo fai un oggetto derivato da Application_Model_DbTable_Esercizi.

Bene anche per questa soluzione a cui non ci avevo pensato...

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda