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.
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
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
Scriverò una risposta più lunga. Non ho esperienza con Doctrine, ma farò del mio meglio per confrontare i due. – birderic