Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Doctrine 1.2

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16

    Doctrine 1.2

    Sto utilizzando Symfony 1.4 con ORM Doctrine 1.2
    Vorrei capire la logica di funzionamento dell'ORM in questione:

    Ho due tabelle MySQL:
    Fasi
    ----
    id|bigint(20)|autoincrement
    fase|varchar(255)
    data_ora|datetime
    tecnico_id|bigint(20)
    created_at|datetime
    updated_at|datetime

    Tecnici
    ----
    id|bigint(20)|autoincrement
    nome|varchar(255)
    cognome|varchar(255)
    reparto|varchar(255)
    created_at|datetime
    updated_at|datetime

    Le due tabelle sono in relazione tra loro attraverso fasi.tecnico_id e tecnici.id

    Se da symfony faccio una semplice select:
    codice:
    SELECT f.fase,f.data_ora,t.nome,t.cognome 
    FROM assistenza_fase AS f, assistenza_tecnico AS t 
    WHERE f.id = '1' AND f.tecnico_id = t.id
    Utilizzando il codice:
    codice:
    $q = Doctrine_Query::create() 
    ->select('f.fase,f.data_ora,t.nome,t.cognome') 
    ->from('assistenza_fase f, assistenza_tecnico t')
    ->where('f.id = '1') 
    ->andWhere('f.tecnico_id = t.id');
    Da MySQL funziona senza problemi, mentre da ORM mi genera un errore di relazione inesistente tra le due tabelle.
    Premesso che in questo codice riportato al volo posso aver fatto degli errori di battitura ma nell'originale no, dove sbaglio concettualmente? Come devo ragionare quando utilizzo un ORM?

  2. #2
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Devi cambiare completamente approccio.
    Immagina che le tabelle non esistano. Esistono solo i modelli.
    Non fai query sulle tabelle, fai query sui modelli.
    Non esistono colonne delle tabelle, esistono i campi dei modelli.

    Quindi, quando fai le query, quello che conta sono le relazioni che hai definito nel tuo schema.

    Ti sconsiglio di usare select(), prendi tutti i campi, tanto non guadagni niente a prenderne solo alcuni.
    Puoi riscrivere la tua query in questo modo (da dentro una classe del modello):

    codice:
    $q = $this->createQuery('f')
     ->where('f.id = ?', $parametro1) 
     ->andWhere('f.tecnico_id = ?', $parametro2);

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    Per modelli si intendono le classi che rappresentano le varie tabelle del database, quindi le relazioni tra le varie tabelle come vanno interpretate come estensioni tra classi?
    Per essere chiaro, nell'esempio ho definito un ON DELETE CASCADE per agevolare le operazioni di cancellazione, quindi?
    Altra domanda, se ad esempio ho due tabelle senza relazione tra di loro, come devo comportarmi?

    Oddio 'mo ste relazioni mi confondono

    PS.: Grazie della risposta

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    AGGIUNTA:
    nel tuo esempio comunque utilizzi sempre la stessa tabella, mentre la mia esigenza è di fare una SELECT tra due tabelle, quindi modificando il codice in:

    codice:
    $q = Doctrine_Query::create()
    ->from('tabella1 t1, tabella2 t2')
    ->where('t1.esempio_id = ?' . $parametro1)
    ->andWhere('t2.id = t1.tabella2_id');
    Ricevo l'errore Unknown relation alias tabella2 anche se in realtà la relazione esiste, come da immagine allegata.
    Immagini allegate Immagini allegate

  5. #5
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Le relazioni sono quelle che hai definito (o che dovresti aver definito) nel tuo schema.
    Il mio esempio resta valido: dovresti partire dalla classe PippoTable (per un modello chiamato "Pippo") e usare $this->createQuery('p'), quindi puoi usare leftJoin('p.altroModello'), dove "altroModello" è il nome di una relazione, cioè una chiave sotto Relations nel tuo schema.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    Originariamente inviato da garakkio
    puoi usare leftJoin('p.altroModello'), dove "altroModello" è il nome di una relazione
    Ho capito!
    In pratica la tabella in relazione diventa un "estensione" della tabella di partenza.
    Ho risolto la mia query con questo codice:

    codice:
    $q = Doctrine_Core::getTable('AssistenzaFase')
    ->createQuery('f')
    ->where('f.commessa_id = ?', $request->getParameter('id'))
    ->leftJoin('f.AssistenzaTecnico t')
    ->andWhere('t.id = ?', $this->tecnico['id']);
    $this->fasi = $q->execute();
    Grazie Massimiliano

  7. #7
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Bene!
    Il prossimo passo è spostare questo codice dentro un metodo di AssistenzaFaseTable.php, a cui passare il parametro $id
    Quindi, supponendo che tu abbia chiamato il metodo "pippo", usare

    $this->fasi = AssistenzaFaseTable::getInstance()->pippo($request->getParameter('id'))

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    Originariamente inviato da garakkio
    Il prossimo passo è spostare questo codice dentro un metodo
    Questo procedimento già lo conoscevo e mi ha permesso di ridurre il controller di dimensione.
    La cosa che però ancora non mi è chiara (forse l'ho già letta ma non mi è rimasta in mente) è come eseguire funzioni al di fuori del controller.

    Esempio:
    Ho due Form da dove carico dei dati
    - executeForm1
    - executeForm2
    Alla fine vorrei fare una funzione di salvataggio e tornare alla schermata iniziale.

    Ad oggi ho creato un terzo metodo nel controller chiamandolo:
    - executeSalva

    Ma credo che potrei "buttare" questa funzione all'interno di una classe ed alleggerire il controller (anche per una questione di leggibilità), ma non ho capito come fare.

    Qualche suggerimento?

  9. #9
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    I metodi del controller non si possono spostare da nessuna parte, sono associati a delle rotte.
    E comunque non posso sapere se hai modo di rifattorizzare, senza vedere il codice

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    Considerando la mia programmazione attuale come hobby più che lavoro, questo è il mio progetto-studio: link

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 © 2025 vBulletin Solutions, Inc. All rights reserved.