Buona libreria PHP ORM?


268

Esiste una buona libreria di mappatura relazionale di oggetti per PHP?

Conosco PDO / ADO, ma sembrano fornire solo un'astrazione delle differenze tra i fornitori di database, non una mappatura effettiva tra il modello di dominio e il modello relazionale. Sto cercando una libreria PHP che funzioni allo stesso modo di Hibernate per Java e NHibernate per .NET.

Risposte:



103

Prova RedBean , richiede:

  • Nessuna configurazione
  • Nessun database (crea tutto al volo)
  • Nessun modello
  • eccetera.

Fa anche tutto il blocco e le transazioni per te e monitora le prestazioni in background. (Cavolo! Fa anche la raccolta dei rifiuti ....) Meglio di tutto ... non devi scrivere una sola ... riga di codice ... Gesù , questo livello ORM , mi ha salvato il culo!


9
redbean è senza dubbio il miglior livello di astrazione del database con cui abbia mai lavorato. non "uno dei migliori" - i migliori.
Nir Gavish,

Molto bella scoperta. Sono molto colpito da questo ORM per non dire altro
Christopher Tarquini,



3
+1 +1 +1 +! +! !!!! ... gesù ho letto la prima parte della documentazione e mi ha fatto ridere sinistre dittatore, e lo sto già scaricando!
KJW,

45

Ce ne sono solo due buoni: Dottrina ed Propel . Favoriamo Doctrine e funziona bene con Symfony . Tuttavia, se stai cercando supporto per il database oltre a quelli principali, dovrai scrivere il tuo codice.


Propel è abbastanza buono per gli standard php. Produce un codice abbastanza pulito che è IDE amichevole con getter e setter e un sistema di astrazione Criteria molto pulito per le query.
0x6A75616E

Dal momento che questa domanda si lega un po 'a SO, ho voluto sottolineare che Propel è un progetto fuori produzione dal 2020. La compatibilità con PHP7 non è mai stata implementata. Pertanto, scegliere Propel come ORM per un nuovo progetto software nel 2020 non è una buona idea.
mrodo,

34

Axon ORM fa parte del Fat-Free Framework : è dotato di un mappatore al volo. Nessun generatore di codice. Nessuno stupido file di configurazione XML / YAML . Legge lo schema del database direttamente dal back-end, quindi nella maggior parte delle operazioni CRUD non è nemmeno necessario estendere un modello di base. Funziona con tutti i principali motori di database supportati da PDO : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL , ecc.

/* SQL */
CREATE TABLE products (
    product_id INTEGER,
    description VARCHAR(128),
    PRIMARY KEY (product_id)
);

/* PHP */
// Create
$product=new Axon('products'); // Automatically reads the above schema
$product->product_id=123;
$product->description='Sofa bed';
$product->save(); // ORM knows it's a new record

// Retrieve
$product->load('product_id=123');
echo $product->description;

// Update
$product->description='A better sofa bed';
$product->save(); // ORM knows it's an existing record

// Delete
$product->erase();

Soprattutto, il plug-in e il relativo livello di accesso ai dati SQL sono leggeri come il framework: 14 KB (Axon) + 6 KB (SQLdb). Fat-Free ha solo 55 KB.


15
Mi preoccupa sempre quando vedo qualcosa di simile $product->load('product_id=123')in un esempio.
Znarkus,

9
per i paranoidi, la sintassi alternativa è$product->load(array('product_id=:id',array(':id'=>123)));
bcosca,

4
Fat-Free ha anche ORM NoSQL per MongoDB e file flat
bcosca,

28

Ho sviluppato Pork.dbObject da solo. (Una semplice implementazione di PHP ORM e Active Record) Il motivo principale è che trovo la maggior parte degli ORM troppo pesanti.

Il pensiero principale di Pork.dbObejct è di essere leggero e semplice da configurare. Nessun gruppo di file XML, solo una funzione chiama nel costruttore per associarlo e un addRelation o addCustomRelation per definire una relazione con un altro dbObject.

Dai un'occhiata: Pork.dbObject


1
Oggi stavo cercando un'implementazione leggera di PHP ORM e ho trovato Pork.dbObject grazie a questo post. Funziona benissimo! +1
E Dominique,

6
Duude! Questo è piuttosto interessante Vedo che l'ultimo aggiornamento è avvenuto da qualche parte nel '09. Questo è ancora mantenuto? Altrimenti ... potrei solo rivitalizzarlo :)
VladFr,

22

Prova Doctrine2 . È probabilmente lo strumento ORM più potente per PHP. Lo sto citando separatamente da Doctrine 1, perché è un software completamente diverso. È stato riscritto da zero, è ancora in fase beta, ma ora è utilizzabile e sviluppato.

È un ORM molto complesso, ma ben progettato. Molta magia dall'originale Doctrine 1 è scomparsa. Fornisce una soluzione completa e puoi scrivere il tuo ORM sopra Doctrine2 o usare solo uno dei suoi livelli .


L'unico problema che mi viene in mente con Doctrine2 è che dipende da PHP 5.3 e versioni successive.
jblue,

8
@jblue: non è un problema, è una funzione ;-). Le grandi librerie come Doctrine hanno bisogno di spazi dei nomi.
Tom Pažourek,

"Un sacco di magia dall'originale Doctrine 1 è scomparsa." - In che senso è positivo?
Olivier 'Ölbaum' Scherler

13

Ho appena iniziato con Kohana e sembra il più vicino a Ruby on Rails senza invocare tutta la complessità di più file di configurazione come con Propel .


Concordo anche sul fatto che Kohana sia il framework più simile al RoR nel mondo PHP. Tutto ciò che manca è l'impalcatura e con il supporto CLI in KO3 è solo una questione di qualcuno che si rimbocca le maniche e lo fa.
Phillip Whelan,

12

Dai un'occhiata a Outlet ORM . È più semplice di Propel e Doctrine e funziona in modo simile a Hibernate, solo con una sensazione più PHP.


3
Ci ho provato Ho dovuto specificare le stesse proprietà dell'oggetto in 3 punti: configurazione, modello e schema del database. C'è molto lavoro per l'implementazione di un IMO ORM.
mixdev,

L'outlet è molto pesante in termini di configurazione.
Lotus Notes,

Ho provato questo (1.0 RC1) ed era molto difettoso anche nella funzionalità di base. E sì, c'è molta configurazione da scrivere. Non lo consiglio.
Szymon Wygnański,

11

Mi piace molto Propel , qui puoi avere una panoramica, la documentazione è abbastanza buona e puoi ottenerla tramite PEAR o SVN.

Hai solo bisogno di un'installazione PHP5 funzionante e Phing per iniziare a generare classi.


Propel può anche "decodificare" uno schema di database esistente, creando oggetti PHP dalla lettura dello schema di database.
David Goodwin,



6

Dai uno scatto a dORM, un mappatore relazionale di oggetti per PHP 5 . Supporta tutti i tipi di relazioni (da 1 a 1), (da 1 a molti), (da molti a molti) e di tipi di dati. È completamente discreto: non è richiesta la generazione di codice o l'estensione della classe. Secondo me è superiore a qualsiasi ORM là fuori, compresi Dottrina e Propel. Tuttavia, è ancora in beta e potrebbe cambiare in modo significativo nei prossimi due mesi. http://www.getdorm.com

Ha anche una curva di apprendimento molto piccola. I tre metodi principali che utilizzerai sono:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);

4

Attualmente sto lavorando su phpDataMapper , che è un ORM progettato per avere una sintassi semplice come il progetto Datamapper di Ruby. È ancora in fase di sviluppo iniziale, ma funziona benissimo.


4

Ho avuto grandi esperienze con Idiorm e Parigi . Idiorm è una libreria ORM piccola e semplice. Parigi è un'implementazione altrettanto semplice di Active Record costruita su Idiorm. È per PHP 5.2+ con DOP. È perfetto se vuoi qualcosa di semplice che puoi semplicemente inserire in un'applicazione esistente.


4

Ho provato la libreria ORM of Flourish .


Sì, ci lavoro da un po 'di tempo. Il flourishlib è eccezionale, ma l'ORM ha ancora del lavoro da fare. Lavorare con le tabelle di join con proprietà o chiavi esterne aggiuntive, creare nuovi oggetti può essere un po 'noioso. Lavorare con modelli semplici è un gioco da ragazzi. Dai un'occhiata a Repose ORM o Outlet per un ORM alternativo per PHP.
Michael,

3

Fino alla versione 5.3 di PHP non aspettatevi di avere un buon ORM. È una limitazione OO di PHP.


In che modo PHP 5.3 aiuterebbe qualcuno a scrivere un ORM migliore? Non vedo alcun motivo.
Ionuț G. Stan,

8
il motivo principale è l'introduzione dell'associazione statica tardiva (parola chiave "statica"). leggilo su blog.felho.hu/…
knoopx

2
Gli ORM non hanno davvero bisogno di variabili statiche, possono essere ben progettate usando solo variabili di istanza.
Tom Pažourek,

È vero, l'associazione statica tardiva è il motivo per cui riesco a ottenere ogni istanza ORM del mio ORM così in basso . Prima dell'associazione statica tardiva era dispendioso come la maggior parte degli altri.
Xeoncross,

3

Io e il mio amico Kien abbiamo migliorato una versione precedente di un ORM che aveva scritto prima di PHP 5.3. Abbiamo essenzialmente portato su PHP il record attivo di Ruby on Rails . Mancano ancora alcune delle funzionalità chiave che desideriamo, come le transazioni, il supporto composito per la chiave primaria, alcuni adattatori (solo MySQL e SQLite 3 funzionano ora). Ma siamo molto vicini a finire queste cose. Puoi dare un'occhiata a PHP ActiveRecord con PHP 5.3 .


3

Prova PHP ADOdb.

Non posso dire che sia il migliore, perché non ho usato gli altri. Ma è veloce, supporta Memcached e cache.

Ed è molto più veloce del DB / Select di Zend Framework .


2
adodb si presta di più al sapore del modello sottile / grasso controller, che generalmente non è una buona cosa.
jblue,

ADOdb ha un ORM (ma non è solo un ORM). È una soluzione davvero eccezionale in generale, funziona molto meglio di Zend per DB (oltre ad essere più lento di ADOdb, Zend DB ha solo un supporto JOIN limitato), supporta l'escaping automatico con la parametrizzazione (a differenza di Doctrine) molti backend DB diversi e ha un bel design di cache estensibile con integrazione memcache semplicissima. Non credo sia affatto preciso affermare che si presta ad un'implementazione di "Thin Model / Fat Controller" (puoi farlo o no, ma il design di ADOdb non favorisce in un modo o nell'altro).
Iain Collins,

3

Dai un'occhiata al LEAP ORM per Kohana . Funziona con un sacco di database, tra cui DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL e SQLite . Con una semplice funzione di caricamento automatico, può funzionare con quasi tutti i framework PHP. Il codice sorgente è su GitHub all'indirizzo https://github.com/spadefoot/kohana-orm-leap . Puoi consultare i tutorial di LEAP online.

La libreria ORM funziona con chiavi primarie non intere e chiavi composite. Le connessioni sono gestite tramite un pool di connessioni al database e funziona con query SQL non elaborate. L'ORM ha persino un generatore di query che semplifica la creazione di istruzioni SQL.


2

Puoi dare un'occhiata a Repose se ti senti avventuroso. Come Outlet , è modellato su Hibernate .

È ancora molto presto nel suo sviluppo, ma finora le uniche restrizioni sul modello di dominio sono che le classi non sono contrassegnate come finali e le proprietà non sono contrassegnate come private. Una volta entrato nella terra di PHP> = 5.3, proverò a implementare anche il supporto per proprietà private.


2

Se stai cercando un ORM che implementa il paradigma di Data Mapper piuttosto che Active Record nello specifico, allora ti consiglio vivamente di dare un'occhiata a GacelaPHP .

Caratteristiche di Gacela:

  • Mappatore dati
  • Mappatura chiave esterna
  • Mappatura dell'associazione
  • Mappatura dipendente
  • Eredità di tabella concreta
  • Oggetto query
  • Mappatura dei metadati
  • Caricamento lento e desideroso
  • Pieno Memcached supporto

Altre soluzioni ORM sono troppo gonfie o presentano pesanti limiti nello sviluppo di qualcosa di remoto complicato. Gacela risolve i limiti dell'approccio al record attivo implementando il modello di mappatura dei dati mantenendo al minimo il gonfiore utilizzando PDO per tutte le interazioni con il database e Memcached.


2

MicroMVC ha un ORM da 13 KB che si basa solo su una classe di database da 8 KB . Restituisce inoltre tutti i risultati come oggetti ORM stessi e utilizza l'associazione statica tardiva per evitare di incorporare informazioni sulla tabella dell'oggetto corrente e metadati in ciascun oggetto. Ciò si traduce nel sovraccarico ORM più economico che ci sia.

Funziona con MySQL , PostgreSQL e SQLite .



2

Agile Toolkit ha un'implementazione unica di ORM / ActiveRecord e SQL dinamico .

Introduzione: http://agiletoolkit.org/intro/1

Sintassi (Record attivo):

$emp=$this->add('Model_Employee');
$emp['name']='John';
$emp['salary']=500;
$emp->save();

Sintassi (SQL dinamico):

$result = $emp->count()->where('salary','>',400)->getOne();

Mentre Dynamic SQL e Active Record / ORM sono utilizzabili direttamente, Agile Toolkit li integra ulteriormente con l'interfaccia utente e l'interfaccia utente jQuery . Questo è simile a JSF ma scritto in puro PHP.

$this->add('CRUD')->setModel('Employee');

Questo visualizzerà AJAXified CRUD con per il modello Employee.


2

NotORM

include "NotORM.php";
 $pdo = new PDO("mysql:dbname=software");
 $db = new NotORM($pdo);
 $applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
foreach ($applications as $id => $application) {
echo "$application[title]\n";
}

2

Volti PHP ORM per estensione DOP. Vedi PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();

1. Il sito è turco; 2. Il tuo codice non è niente di diverso dal codice che utilizzeresti, ad esempio, con Doctrine.
Il Pellmeister il


1

Un altro ottimo ORM PHP open source che usiamo è PHPSmartDb . È stabile e rende il tuo codice più sicuro e pulito. La funzionalità del database al suo interno è senza dubbio la più semplice che abbia mai usato con PHP 5.3.


1

La dottrina è probabilmente la soluzione migliore. Prima di Doctrine, DB_DataObject era essenzialmente l'unica altra utility open source.


1

Se stai cercando un ORM, come Hibernate , dovresti dare un'occhiata a PMO .

Può essere facilmente integrato in un'architettura SOA (c'è solo una classe di servizi web da sviluppare).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.