creare una zend_db_select generica

ciao, visto che è il mio primo topic quì approfitto per salutare tutti.

vengo al punto:

vorrei crearmi un oggetto zend_db_select da richiamare nei controller per estrarre dati dal database in totale libertà

ho inserito un model Select.php

class MyApp_Model_Select extends Zend_Db_Select
{
}

come si fa con le zend_db_table.

riesco ad istanziarlo dentro ai controller

$sel = new MyApp_Model_Select();

 ma non funziona perché gli manca il collegamento col db_Adapter, che dovrei giustamente  passare al costrittore.

a questo punto però mi perdo perché non riesco a capire dove è stata costruita l'istanza del resource.db nella quale immagino di poter trovare il db_Adapter

spero di essere riuscito a spiegarmi

pensate che sono molto fuori strada?

ciao

inviato 7 anni fa
fabio.pellati
X 0 X

aggiungo una nota di chiarezza.

non vorrei istanziare nuovamente il db: vorrei utilizzare l'istanza, definita nel file di configurazione, utilizzata da zend per istanziare ad esempio le db_table.

risposto 7 anni fa
fabio.pellati
X 0 X

Perchè non estendi semplicemente zend_db_table?

Hai già guardato la documentazione per zend_db_select?

http://framework.zend.com/manual/en/zend.db.select.html

risposto 7 anni fa
Mario Santagiuliana
X 0 X

grazie per la risposta MarioS.

Premetto che non ho ancora acquisito familiarità  col framework e potrei chiaramente dire qualche scemenza

1) sto cercando di mantenere una certa "igene" nel codice e Zend_db_table lo uso per gestire le tabelle (pure e secche) cioè essenzialmente per aggiornare i dati od estrarre dati direttamente dalle tabelle stesse. Ma spesso ho bisogno di effettuare query complesse che coinvolgono parecchie tabelle legate da join per cui uno strumento che mi aiuti a comunicare col motore di SQL mi fa proprio comodo e mi sembra che zend_db_select faccia al caso (soprattutto perchè indipendente dal tipo di db sottostante).

si ho letto la documentazione e credo di aver capito come va usata; quello che non capisco è questo

$db = Zend_Db::factory( ...options... );
$select = new Zend_Db_Select($db);

non capisco quel Zend_Db::factory perchè con questo metodo vado a gestire una nuova connessione al database, mentre io vorrei usare quella che già il framework crea per connettere gli altri oggetti (es. db_table) e per il quale pesca i parametri dal file di configurazione.

risposto 7 anni fa
fabio.pellati
X 0 X

Potresti memorizzare l'oggetto Zend_Db in Zend_Registry e recuperarlo ovunque tu voglia

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

è un'idea, ma a me mancano ancora un paio di tasselli del puzzle: tra cui quello che mi dice quando (nella logica applicativa) e dove (nello script):

allora: inizializzo un'istanza di Zend_Application e lancio il bootstrap

$application = new Zend_Application(
   APPLICATION_ENV,
   APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
$application->run();

a questo punto mi trovo dentro all'istanza $application che contiene tutto il pattern MVC e lo script termina, dopo aver fatto tutto il lavoro, con la distruzione di tutti gli oggetti e l'uscita dal metodo run(). (fin quì ci sono?)

Ora se voglio istanziare un oggetto di un qualche genere, nel mio caso la connessione al db mi son fatto l'idea che questo esista dentro a $application quindi potrei fare così

$application = new Zend_Application(...);

$registry = Zend_Registry::getInstance();
$application->bootstrap();
$registry['db'] = $application->resources->db; //so che non ha senso ma e' per dare l'idea di cosa cerco
$registry['dbadapter'] = $application->resources->db->_adapter; //idem come sopra
$application->run();

il fatto che non funziona mi fa capire che c'è qualcosa che non va  :-\

risposto 7 anni fa
fabio.pellati
X 0 X

Faccio un merge con il thread "gestire relazioni con più tabelle".

in quel caso partendo da una zend_db_table che espone un metodo select() avete ottenuto grossomodo quello che cerco ma in maniera meno astratta di come la sto cercando io.

io vorrei, come dice mario, ottenere il medesimo risultato usando zend_db_select

risposto 7 anni fa
fabio.pellati
X 0 X

Allora ne sono uscito così:

dentro alla classe Bootstrap ho inserito il metodo

   private  function _initDb()
    {
        $db_config = new Zend_Config_Ini(APPLICATION_PATH.'/configs/application.ini', 'production');
        $db = Zend_Db::factory($db_config->resources->db);
        $registry = Zend_Registry::getInstance();
        $registry->set('db', $db);
    }

dopodiché  richiamo il db in qualunque punto del codice con

$registry = Zend_Registry::getInstance();
$db = $registry['db']

per la verità la select non mi funziona ancora ma almeno sembra inizializzarla.

per il momento grazie

spero che fra un pò io possa ricambiare

risposto 7 anni fa
fabio.pellati
X 0 X

No, neanche così va bene.

in questo modo non esegue più tutta l'inizializzazione automatica delle risorse e non funzionano più le zend_db_table.

 :'(

risposto 7 anni fa
fabio.pellati
X 0 X

Avevi detto che sembrava inizializzare il tutto, puoi farci vedere come è il codice che inizializzi?

Da errori?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

si di errori ne da ma non sulla select, sulle dbTable che con quel metodo di inizializzazione del db smettono di funzionare

, ma ho risolto definitivamente, non tocco più la classe Bootstrap, dentro alla classe controller_action inizializzo la mia select così :

$bs = $this->getInvokeArg('bootstrap');
$db =$bs->getResource('db');
$sel = new Default_Model_Select($db);
Default_Model_Select

è una classe che estende Zend_Db_Select

in questo modo posso lasciare inalterata la classe Bootstrap così funziona la classe select che posso usare in ogni controller_action

e funziona anche il resto

ragazzi intanto grazie, e poi vi saluto fino al mese prossimo  :bye:  da ieri sono in ferie e me ne vado in Marocco  :D

ciao

risposto 7 anni fa
fabio.pellati
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda