2012-01-12 15 views
6

Mi piace molto l'Active Record di CodeIgniter e quanto bene consente tutte le mie richieste di database necessarie.Cosa aggiunge Doctrine Active Record - CodeIgniter?

Ma ho anche letto su ORM come Doctrine. Quando leggo la documentazione di Doctrine, non mi sembra chiaro da usare come Active Record e non riesco a vedere cosa lo rende migliore (se lo è).

Cosa consente Doctrine che non sia possibile con Active Record? Doctrine fa lo stesso lavoro più velocemente, più facilmente, meglio? O fa cose che Active Record non può fare?

La cosa migliore sarebbe se le persone potessero pubblicare esempi di attività che mostrassero quello di cui stiamo parlando.

Grazie, Matthew

+0

Doctrine è un ORM completo che implementa il modello di registrazione attivo. La classe di record attiva di CodeIgniter è più un generatore di query basato su una versione "modificata" del pattern. – birderic

+0

Ciao birderic, Grazie per la rapida risposta. Puoi darmi un esempio in cui questo entrerebbe in gioco? Stiamo parlando di cose come le operazioni CRUD? – MatthewSchenker

+0

Scriverò una risposta più lunga. Non ho esperienza con Doctrine, ma farò del mio meglio per confrontare i due. – birderic

risposta

9

dottrina è un'ORM vera e propria che implementa il pattern record attivo. La classe di record attiva di CodeIgniter è un generatore di query/wrapper di database basato su una versione "modificata" del pattern.

Disclaimer: Non ho mai usato Doctrine. Farò del mio meglio per illustrare le differenze tra l'implementazione del record attivo di CodeIgniter e Doctrine, sulla base della mia comprensione.

Utilizzando classe record attivo di CodeIgniter, si potrebbe implementare un modello come questo:

class User_model extends CI_Model 
{ 

    public function get_user_by_username($username) 
    { 
     // Build query using active record methods 
     $this->db->where('username', $username); 
     $this->db->where('active', 1); 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->result(); 
    } 

    // ... 

} 

Tu sei fondamentalmente costruendo la query utilizzando i metodi record attivo. È facile vedere come ciascun metodo (where(), get(), ecc.) Sia mappato su SQL raw. Il vantaggio di utilizzare i metodi di registrazione attivi rispetto a solo $this->db->query() è che CodeIgniter compila ogni query in base al driver di database che si sta utilizzando. Oltre a ciò, l'implementazione di record attiva di CodeIgniter in realtà non fa molto. Qualsiasi domanda tu abbia bisogno, dovrai creare. Spero di aver illustrato come i metodi di registrazione attivi sono simili a un generatore di query.

Si noti che il seguente codice di esempio potrebbe non essere corretto. Utilizzando dottrina, si potrebbe avere un modello come questo:

/** @Entity */ 
class User 
{ 

    /** @Column(type="integer") */ 
    private $id; 

    /** @Column(length=50) */ 
    private $username; 

    // ... 

} 

quindi di utilizzare il modello e la funzionalità record attivo associato, si potrebbe fare qualcosa di simile:

// Instantiate object 
$user = new User(); 

// Set properties 
$user->username = 'some_username'; 

// Save object 
$user->save(); 

// Access properties 
echo $user->id; 

Questo è solo l'inizio in termini di ciò che Doctrine può fare. È possibile impostare valori predefiniti per le proprietà o specificare le relazioni tra le tabelle. Si noti come non ho scritto alcun SQL o costruito la query. Ho appena impostato le proprietà dell'oggetto e quindi salvato. La dottrina si prende cura di tutto il resto.

Si noti che Doctrine include il proprio generatore di query, quindi in un modo fa ciò che fa il record attivo di CodeIgniter e altro ancora.

L'uso di Doctrine è simile all'implementazione del pattern di registrazione attivo di CakePHP o Ruby on Rails. Puoi dare un'occhiata lì per ulteriori informazioni sul modello. Gli esempi di CakePHP potrebbero essere particolarmente facili da digerire se provieni da uno sfondo CodeIgniter.

Per rispondere ad alcune delle altre domande, non penso che ci sia qualcosa che rende Doctrine migliore dei metodi di registrazione attivi CodeIgniter. Potrebbe essere più avanzato, ma come qualsiasi altra libreria, vuoi scegliere lo strumento migliore per il lavoro.Se sei soddisfatto dei metodi di registrazione attivi di CodeIgniter e non vedi la necessità di un ORM avanzato, salta.

+1

birderic, grazie gentilmente per questa risposta. Mi aiuta a vedere cosa stavo cercando. Ho anche studiato la classe di database di Symfony e sembra più simile ai metodi CakePHP. Sono contento di sapere che entrambi i metodi possono raggiungere gli stessi obiettivi generali, anche se ci arrivano in modo diverso. – MatthewSchenker

+0

Doctrine 2.x non usa record attivo. Utilizza pattern di mappatura dei dati. –

18

Prima di tutto di cosa parla Doctrine, 1 o 2?
C'è un'enorme differenza. L'unica cosa che i due hanno in comune è che sono entrambi ORM-s a tutti gli effetti. Altrimenti non c'è davvero alcuna connessione tra i due.

Dottrina 1 si basa su ActiveRecords, Doctrine 2 si basa su mapper dati modello.
Entrambi possono fare le stesse cose, ma ci sono alcune differenze significative tra i due.

Generalmente, Data Maper è meno "sviluppatore-friendly" ma dovrebbe avere prestazioni migliori. Perché? In realtà è piuttosto semplice. Con i record attivi ogni entità conosce tutto "attorno" a sé, la relazione con altre entità, ecc. Con il mappatore dei dati, le entità sono stupide e leggere, esiste un'entità centrale (EntityManager/UnitOfWork in Doctrine2) che gestisce tutta la mappatura delle relazioni. Quindi in termini di utilizzo della memoria e prestazioni, Data Mapper dovrebbe essere più veloce.
I ragazzi di Doctrine dicono che Doctrine2 è almeno il 50% più veloce di Doctrine1 (ci sono anche altre differenze, non solo il modello di progettazione).

Se ci si sente, è possibile implementare anche ActiveRecords su Doctrine2 data mapper. Guarda questo blog post. Sto usando questo approccio solo per la fase di sviluppo, per mantenere il minor numero possibile di codice. Una volta entrato in produzione, ucciderò il layer ActiveRecords aggiuntivo e ripristinerò il mapper dei dati predefinito di Doctrine2.

Quindi la conclusione è che si può fare tutto con entrambi, ma allo stesso modo si potrebbe dire che si può fare tutto con SQL raw. Se sei un principiante nel mondo ORM, suggerirei di andare con ActiveRecords, perché è semplice e (di solito) richiede meno codice. D'altro canto, se si sta costruendo un modello grande e complesso, ritengo che il mapper dei dati sia l'opzione migliore.

Forse ho sbagliato qualcosa, ma è così che l'ho capito.

Per quanto riguarda il confronto tra CodeIgniters ActiveRecords e Doctrine (1 o 2), non posso davvero dire, perché non ho mai usato CodeIgniter. Una cosa di cui sono sicuro, Doctrine ha molte più funzionalità rispetto all'ORM predefinito di CodeIgniters. Ad esempio: idratazione dei risultati, ereditarietà (tabella singola, tabella di classe), precaricamento, caricamento lazy, caricamento lazy extra, estensioni, comportamenti, ottimizzazione, proxy, gestione datetime ... È un ORM massiccio e completo con un sacco di caratteristiche, mentre la mia esperienza con qualsiasi "ORM predefinito" è che il loro obiettivo principale è quello di essere il più semplice possibile, in modo che un principiante possa farcela facilmente. La dottrina è una bestia potente, e sicuramente può fare molte cose in un modo più efficiente e/o logicamente più corretto rispetto al built-in CodeIgniter ORM. Il rovescio della medaglia è che ci vuole più tempo per imparare e programmare, ed è un'enorme libreria, con migliaia di file, quindi solo per far funzionare tutto ciò aggiunge un sovraccarico rispetto a un'alternativa più leggera.

+0

ZolaKt, grazie per la tua risposta. Sto parlando delle ultime versioni di tutto. Mi piacciono quelle funzionalità aggiuntive che descrivi per Doctrine. In generale, mi piace molto CodeIgniter, ma sono nuovo per i framework in generale. Sembra che il mio miglior approccio sarebbe quello di padroneggiare la classe Active Record di CodeIgniter, quindi cercare di usare Doctrine in CodeIgniter in un secondo momento. – MatthewSchenker

+0

Questo è puramente soggettivo, ma se hai intenzione di imparare un framework dai un'occhiata a Kohana. È un po 'più flessibile grazie all'integrazione di altre librerie rispetto a CodeIgniter. Le ultime versioni vanno bene, ma come ho detto questi sono 2 progetti completamente diversi, su due modelli diversi. Se stai facendo un project stick "più piccolo" con i record attivi predefiniti ORM. Possono fare quasi tutto Doctrine, anche se alcune cose devono essere fatte manualmente. Una cosa che ho notato, molto raramente quegli ORM supportano l'ereditarietà, quindi se ne hai bisogno, trova qualcosa che possa farlo, come Doctrine. – ZolaKt

+0

Un altro consiglio. Leggete e provate prima di decidere quale usare. Non limitarti a CodeIgniters ORM, ci sono alcuni buoni ORM attivi in ​​PHP. È tutto sul modello. Se conosci un record attivo ORM, conoscerai l'altro in poco tempo. Lo stesso vale per il data mapper. Ad esempio, se conosci Dottrina, saprai (N) Ibernazione. Se decidi di preferire i record attivi su data mapper, puoi anche controllare Propel. Un ORM completo basato su record attivi. Da quello che ho visto l'unica alternativa PHP a Doctrine se vuoi tutte le funzionalità "fantasiose" – ZolaKt

Problemi correlati