Bonne bibliothèque PHP ORM?

268

Existe-t-il une bonne bibliothèque de mappage relationnel-objet pour PHP?

Je connais PDO / ADO, mais ils semblent seulement fournir une abstraction des différences entre les fournisseurs de bases de données et non une correspondance réelle entre le modèle de domaine et le modèle relationnel. Je recherche une bibliothèque PHP qui fonctionne de la même manière que Hibernate pour Java et NHibernate pour .NET.

Peter Mortensen
la source

Réponses:

103

Essayez RedBean , cela nécessite:

  • Pas de configuration
  • Pas de base de données (il crée tout à la volée)
  • Pas de modèles
  • etc.

Il fait même tout le verrouillage et les transactions pour vous et surveille les performances en arrière-plan. (Heck! Il fait même la collecte des ordures ....) Le meilleur de tous ... vous n'avez pas à écrire une seule ... ligne de code ... Jésus ceci , couche ORM , m'a sauvé le cul!

jnewman
la source
9
redbean est de loin la meilleure couche d'abstraction de base de données avec laquelle j'ai jamais travaillé. pas "l'un des meilleurs" - le meilleur.
Nir Gavish
Très belle trouvaille. Je suis très impressionné par cet ORM pour le moins
Christopher Tarquini
1
Comparez RedBean avec Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... jésus J'ai lu la première partie de la documentation et ça m'a fait rire de sinistre dictateur, et je la télécharge déjà!
KJW
45

Il n'y en a que deux bons: Doctrine et Propel . Nous privilégions Doctrine, et cela fonctionne bien avec Symfony . Cependant, si vous recherchez un support de base de données en plus des principaux, vous devrez écrire votre propre code.

Peter Mortensen
la source
Propel est assez bon selon les normes php. Il produit un code assez propre qui est compatible avec l'EDI avec les getters et setters et un système d'abstraction de critères très propre pour les requêtes.
0x6A75616E
Puisque cette question est un peu liée à SO, je voulais souligner que Propel est un projet abandonné à partir de 2020. La compatibilité PHP7 n'a jamais été implémentée. Donc, choisir Propel comme ORM pour un nouveau projet logiciel en 2020 n'est pas une bonne idée.
mrodo
34

Axon ORM fait partie du Framework Fat-Free - il dispose d'un mappeur à la volée. Pas de générateurs de code. Aucun fichier de configuration stupide XML / YAML . Il lit le schéma de la base de données directement depuis le backend, donc dans la plupart des opérations CRUD , vous n'avez même pas à étendre un modèle de base. Il fonctionne avec tous les principaux moteurs de base de données pris en charge par PDO : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL , etc.

/* 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();

Surtout, le plug-in et la couche d'accès aux données SQL qui l'accompagne sont tout aussi légers que le framework: 14 Ko (Axon) + 6 Ko (SQLdb). Sans gras ne fait que 55 Ko.

restant
la source
15
Cela m'inquiète toujours quand je vois quelque chose comme $product->load('product_id=123')dans un exemple.
Znarkus
9
pour les paranoïdes, la syntaxe alternative est$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
4
Fat-Free dispose également d'ORM NoSQL pour MongoDB et les fichiers plats
bcosca
28

J'ai développé Pork.dbObject moi-même. (Une simple mise en œuvre de PHP ORM et Active Record) La raison principale est que je trouve la plupart des ORM trop lourds.

La pensée principale de Pork.dbObejct est d'être légère et simple à installer. Pas de tas de fichiers XML, juste un appel de fonction dans le constructeur pour le lier, et une addRelation ou addCustomRelation pour définir une relation avec un autre dbObject.

Donnez-lui un coup d'oeil: Pork.dbObject

SchizoDuckie
la source
1
Je cherchais une implémentation PHP ORM légère aujourd'hui et j'ai trouvé Pork.dbObject grâce à ce post. Ça marche super! +1
E Dominique
6
Duude! C'est assez intéressant. Je vois que la dernière mise à jour s'est produite quelque part en '09. Est-ce toujours maintenu? Sinon ... je pourrais peut-être le faire revivre :)
VladFr
22

Essayez Doctrine2 . C'est probablement l'outil ORM le plus puissant pour PHP. Je le mentionne séparément de Doctrine 1, car c'est un logiciel complètement différent. Il a été réécrit à partir de zéro, est toujours en phase bêta, mais il est maintenant utilisable et développé.

C'est un ORM très complexe, mais bien conçu. Beaucoup de magie de la Doctrine 1 originale a disparu. Il fournit une solution complète et vous pouvez écrire votre propre ORM au-dessus de Doctrine2 ou utiliser une seule de ses couches .

tomp
la source
Le seul problème auquel je peux penser avec Doctrine2 est qu'il dépend de PHP 5.3 et plus.
jblue
8
@jblue: Ce n'est pas un problème, c'est une fonctionnalité ;-). Les grandes bibliothèques comme Doctrine ont besoin d'espaces de noms.
Tom Pažourek
"Beaucoup de magie de la Doctrine 1 originale a disparu." - En quoi est-ce positif?
Olivier 'Ölbaum' Scherler
13

Je viens de commencer avec Kohana , et il semble le plus proche de Ruby on Rails sans invoquer toute la complexité de plusieurs fichiers de configuration comme avec Propel .

Zak
la source
Je suis également d'accord pour dire que Kohana est le framework qui ressemble le plus à RoR dans le monde PHP. Il ne manque que des échafaudages, et avec le support CLI dans KO3, c'est juste une question de quelqu'un qui retrousse ses manches et le fait.
Phillip Whelan
12

Découvrez l' ORM de sortie . Il est plus simple que Propel et Doctrine et il fonctionne de manière similaire à Hibernate, mais avec plus de sensations PHP.

Alvaro
la source
3
J'ai essayé ça. J'ai dû spécifier les mêmes propriétés d'objet à 3 endroits - config, modèle et schéma de base de données. Cela représente beaucoup de travail pour la mise en œuvre d'un OMI IMO.
mixdev
La prise est très lourde en configuration.
Lotus Notes
J'ai essayé ceci (1.0 RC1) et c'était très bogué même dans la fonctionnalité de base. Et oui, il y a beaucoup de configuration à écrire. Je ne le recommande pas.
Szymon Wygnański
11

J'aime vraiment Propel , ici vous pouvez avoir un aperçu, la documentation est assez bonne, et vous pouvez l'obtenir via PEAR ou SVN.

Vous avez seulement besoin d'une installation PHP5 fonctionnelle et de Phing pour commencer à générer des classes.

CMS
la source
Propel peut également «désosser» un schéma de base de données existant - en créant des objets PHP à partir de la lecture du schéma de base de données.
David Goodwin
8

J'ai trouvé des classes liées à ORM dans la bibliothèque PHP Flourish .

VDVLeon
la source
6

Donnez un coup de main à dORM, un mappeur relationnel objet pour PHP 5 . Il prend en charge toutes sortes de relations (1 à 1), (1 à plusieurs), (plusieurs à plusieurs) et types de données. Il est totalement discret: aucune génération de code ou extension de classe n'est requise. À mon avis, il est supérieur à tout ORM, Doctrine et Propel inclus. Cependant, il est toujours en version bêta et pourrait changer considérablement au cours des prochains mois. http://www.getdorm.com

Il a également une très petite courbe d'apprentissage. Les trois principales méthodes que vous utiliserez sont:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);
Olivier Lalonde
la source
4

Je travaille actuellement sur phpDataMapper , qui est un ORM conçu pour avoir une syntaxe simple comme le projet Datamapper de Ruby. C'est encore au début du développement, mais cela fonctionne très bien.

Vance Lucas
la source
4

J'ai eu de grandes expériences avec Idiorm et Paris . Idiorm est une petite bibliothèque ORM simple. Paris est une implémentation Active Record tout aussi simple basée sur Idiorm. C'est pour PHP 5.2+ avec PDO. C'est parfait si vous voulez quelque chose de simple que vous pouvez simplement déposer dans une application existante.

Sander Marechal
la source
4

J'ai essayé l' ORM de la bibliothèque Flourish .

eaguilar
la source
Oui, je travaille avec elle depuis un certain temps. Le bloomishlib est génial, mais l'ORM a encore du travail à faire. Travailler avec des tables de jointure qui ont des propriétés supplémentaires ou des clés étrangères, créer de nouveaux objets peut être un peu fastidieux. Travailler avec des modèles simples est un jeu d'enfant. Jetez un œil à Repose ORM ou Outlet pour une alternative ORM pour PHP.
Michael
3

Jusqu'à la sortie de PHP 5.3, ne vous attendez pas à avoir un bon ORM. C'est une limitation OO de PHP.

knoopx
la source
Alors, comment PHP 5.3 pourrait-il aider quelqu'un à écrire un meilleur ORM? Je ne vois aucune raison.
Ionuț G. Stan
8
la raison principale est l'introduction de la liaison statique tardive (mot-clé "statique"). lire à ce sujet sur blog.felho.hu/…
knoopx
2
ORM n'a pas vraiment besoin de variables statiques, elles peuvent être bien conçues en utilisant uniquement des variables d'instance.
Tom Pažourek
Certes, la liaison statique tardive est la raison pour laquelle je peux obtenir chaque instance ORM de mon propre ORM si bas . Avant la liaison statique tardive, c'était aussi inutile que la plupart des autres.
Xeoncross
3

Mon ami Kien et moi avons amélioré une version antérieure d'un ORM qu'il avait écrit avant PHP 5.3. Nous avons essentiellement porté sur PHP l' enregistrement actif de Ruby on Rails . Il manque encore certaines fonctionnalités clés que nous voulons, telles que les transactions, la prise en charge de la clé primaire composite, quelques adaptateurs supplémentaires (seuls MySQL et SQLite 3 fonctionnent actuellement). Mais, nous sommes très près de terminer ce genre de choses. Vous pouvez jeter un œil à PHP ActiveRecord avec PHP 5.3 .

Jacques Fuentes
la source
3

Essayez PHP ADOdb.

Je ne peux pas dire que c'est le meilleur, car je n'ai pas utilisé les autres. Mais c'est rapide, il prend en charge Memcached et la mise en cache.

Et c'est beaucoup plus rapide que DB / Select de Zend Framework .

Peter Mortensen
la source
2
adodb se prête davantage à la saveur Thin Model / Fat Controller, ce qui n'est généralement pas une bonne chose.
jblue
ADOdb a un ORM (mais n'est pas seulement un ORM). C'est une très bonne solution en général, cela fonctionne beaucoup mieux que Zend pour DB (en plus d'être plus lent que ADOdb, Zend DB a seulement un support JOIN limité), il prend en charge l'échappement automatique avec paramétrage (contrairement à Doctrine) de nombreux backends DB différents et a une belle conception de mise en cache extensible avec une intégration memcache super facile. Je ne pense pas qu'il soit exact de dire que cela se prête à une implémentation de "Thin Model / Fat Controller" (vous pouvez le faire ou non, mais la conception d'ADOdb ne favorise ni l'un ni l'autre).
Iain Collins
3

Jetez un oeil à l' ORM LEAP pour Kohana . Il fonctionne avec un tas de bases de données, notamment DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL et SQLite . Avec une simple fonction de chargement automatique, il peut fonctionner avec presque tous les frameworks PHP. Le code source est sur GitHub à https://github.com/spadefoot/kohana-orm-leap . Vous pouvez consulter les didacticiels de LEAP en ligne.

La bibliothèque ORM fonctionne avec des clés primaires non entières et des clés composites. Les connexions sont gérées via un pool de connexions de base de données et cela fonctionne avec des requêtes SQL brutes. L'ORM a même un générateur de requêtes qui rend la construction d'instructions SQL super simple.

Matthew
la source
2

Vous pouvez consulter Repose si vous vous sentez aventureux. Comme Outlet , il s'inspire d' Hibernate .

Il est encore très tôt dans son développement, mais jusqu'à présent, les seules restrictions sur le modèle de domaine sont que les classes ne sont pas marquées finales et les propriétés ne sont pas marquées privées. Une fois arrivé au pays de PHP> = 5.3, j'essaierai également d'implémenter le support des propriétés privées.

Beau Simensen
la source
2

Si vous recherchez un ORM qui implémente le paradigme Data Mapper plutôt que Active Record spécifiquement, alors je vous suggère fortement de jeter un œil à GacelaPHP .

Caractéristiques de Gacela:

  • Mappeur de données
  • Mappage de clé étrangère
  • Cartographie d'association
  • Cartographie dépendante
  • Héritage de table en béton
  • Objet de requête
  • Mappage des métadonnées
  • Chargement paresseux et désireux
  • Prise en charge complète de Memcached

D'autres solutions ORM sont trop gonflées ou ont des limitations lourdes lors du développement de quelque chose de compliqué à distance. Gacela résout les limites de l'approche d'enregistrement actif en implémentant le modèle de mappeur de données tout en limitant au minimum le gonflement en utilisant PDO pour toutes les interactions avec la base de données et Memcached.

Noah Goodrich
la source
2

MicroMVC a un ORM de 13 Ko qui ne repose que sur une classe de base de données de 8 Ko . Il renvoie également tous les résultats en tant qu'objets ORM eux-mêmes et utilise une liaison statique tardive pour éviter d'incorporer des informations sur la table et les métadonnées de l'objet actuel dans chaque objet. Il en résulte les frais généraux ORM les moins chers qui existent.

Il fonctionne avec MySQL , PostgreSQL et SQLite .

Peter Mortensen
la source
2

ORM brésilien: http://www.hufersil.com.br/lumine . Il fonctionne avec PHP 5.2+. À mon avis, c'est le meilleur choix pour les Portugais et les Brésiliens, car il a une documentation facile à comprendre et de nombreux exemples à télécharger.

Paulo Araujo
la source
2

Agile Toolkit possède sa propre implémentation unique d'ORM / ActiveRecord et de SQL dynamique .

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

Syntaxe (enregistrement actif):

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

Syntaxe (Dynamic SQL):

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

Alors que Dynamic SQL et Active Record / ORM sont directement utilisables, Agile Toolkit les intègre davantage avec l'interface utilisateur et l'interface utilisateur jQuery . Ceci est similaire à JSF mais écrit en PHP pur.

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

Cela affichera AJAXified CRUD avec pour le modèle Employé.

romaninsh
la source
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";
}
Charlie Chai
la source
2

PHP ORM Faces pour l'extension PDO. Voir PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Kurt
la source
1. Le site est turc; 2. Votre code n'est pas différent du code que vous utiliseriez avec par exemple Doctrine.
The Pellmeister
1

Regardez http://code.google.com/p/lworm/ . Il s'agit d'un système ORM très simple, mais puissant et léger pour PHP. Vous pouvez également l'étendre facilement si vous le souhaitez.

Faz
la source
1

Un autre grand ORM PHP open source que nous utilisons est PHPSmartDb . Il est stable et rend votre code plus sûr et plus propre. La fonctionnalité de base de données qu'elle contient est de loin la plus simple que j'ai jamais utilisée avec PHP 5.3.

Joe
la source
1

La doctrine est probablement votre meilleur pari. Avant Doctrine, DB_DataObject était essentiellement le seul autre utilitaire à source ouverte.

anon
la source
1

Si vous cherchez un ORM, comme Hibernate , vous devriez regarder PMO .

Il peut être facilement intégré dans une architecture SOA (il n'y a qu'une classe de webservice à développer).

anonyme
la source