Gute PHP ORM Bibliothek?

268

Gibt es eine gute objektrelationale Mapping-Bibliothek für PHP?

Ich kenne PDO / ADO, aber sie scheinen nur eine Abstraktion der Unterschiede zwischen Datenbankanbietern zu bieten, keine tatsächliche Zuordnung zwischen dem Domänenmodell und dem relationalen Modell. Ich suche nach einer PHP-Bibliothek, die ähnlich funktioniert wie Hibernate für Java und NHibernate für .NET.

Peter Mortensen
quelle

Antworten:

103

Probieren Sie RedBean aus , es erfordert:

  • Keine Konfiguration
  • Keine Datenbank (es erstellt alles im laufenden Betrieb)
  • Keine Modelle
  • etc.

Es erledigt sogar alle Sperren und Transaktionen für Sie und überwacht die Leistung im Hintergrund. (Heck! Es ist auch Garbage Collection ....) Best of all ... Sie müssen nicht eine einzige ... Codezeile schreiben ... Jesus diese , ORM - Schicht , rettete mich ass!

jnewman
quelle
9
redbean ist zweifellos die beste Datenbankabstraktionsschicht, mit der ich je gearbeitet habe. nicht "einer der besten" - der beste.
Nir Gavish
Sehr schöner Fund. Ich bin sehr beeindruckt von diesem ORM, um es gelinde auszudrücken
Christopher Tarquini
1
Vergleichen Sie RedBean mit Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... jesus Ich habe den ersten Teil der Dokumentation gelesen und dabei unheimliches Diktatorlachen ausgelöst, und ich lade es bereits herunter!
KJW
45

Es gibt nur zwei gute: Lehre und Antrieb . Wir bevorzugen Doctrine und es funktioniert gut mit Symfony . Wenn Sie jedoch neben den wichtigsten auch Datenbankunterstützung suchen, müssen Sie Ihren eigenen Code schreiben.

Peter Mortensen
quelle
Propel ist für PHP-Verhältnisse ziemlich gut. Es erzeugt ziemlich sauberen Code, der IDE-freundlich ist und Getter und Setter sowie ein sehr sauberes Kriterienabstraktionssystem für Abfragen bietet.
0x6A75616E
Da diese Frage ziemlich häufig mit SO verknüpft ist, wollte ich darauf hinweisen, dass Propel ab 2020 ein eingestelltes Projekt ist. Die PHP7-Kompatibilität wurde nie implementiert. Daher ist es keine gute Idee, Propel als ORM für ein neues Softwareprojekt im Jahr 2020 zu wählen.
Mrodo
34

Axon ORM ist Teil des Fat-Free Framework - es verfügt über einen On-the-Fly-Mapper. Keine Codegeneratoren. Keine dummen XML / YAML- Konfigurationsdateien. Das Datenbankschema wird direkt aus dem Backend gelesen, sodass Sie bei den meisten CRUD- Vorgängen nicht einmal ein Basismodell erweitern müssen. Es funktioniert mit allen gängigen PDO- unterstützten Datenbankmodulen: MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL usw.

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

Vor allem das Plug-In und die zugehörige SQL-Datenzugriffsschicht sind genauso leicht wie das Framework: 14 KB (Axon) + 6 KB (SQLdb). Fettfrei ist nur 55 KB.

stillstanding
quelle
15
Es macht mir immer Sorgen, wenn ich so etwas wie $product->load('product_id=123')in einem Beispiel sehe .
Znarkus
9
für Paranoiden ist die alternative Syntax$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
4
Fat-Free hat auch NoSQL-ORMs für MongoDB und
Flatfiles
28

Ich habe Pork.dbObject selbst entwickelt. (Eine einfache Implementierung von PHP ORM und Active Record) Der Hauptgrund ist, dass ich die meisten ORMs zu schwer finde.

Der Hauptgedanke von Pork.dbObejct ist, leicht und einfach einzurichten zu sein. Keine Reihe von XML-Dateien, nur ein Funktionsaufruf im Konstruktor zum Binden und eine addRelation oder addCustomRelation zum Definieren einer Beziehung zu einem anderen dbObject.

Probieren Sie es aus: Pork.dbObject

SchizoDuckie
quelle
1
Ich habe heute nach einer leichten PHP ORM-Implementierung gesucht und dank dieses Beitrags Pork.dbObject gefunden. Es funktioniert super! +1
E Dominique
6
Duude! Das ist ziemlich interessant. Ich sehe, dass das letzte Update irgendwo in '09 passiert ist. Wird das noch gepflegt? Wenn nicht ... könnte ich es einfach wiederbeleben :)
VladFr
22

Versuchen Sie Doctrine2 . Es ist wahrscheinlich das leistungsstärkste ORM-Tool für PHP. Ich erwähne es getrennt von Lehre 1, weil es eine völlig andere Software ist. Es wurde von Grund auf neu geschrieben, befindet sich noch in der Beta-Phase, ist aber jetzt verwendbar und entwickelt.

Es ist ein sehr komplexes ORM, aber gut gestaltet. Viel Magie aus der ursprünglichen Lehre 1 verschwand. Es bietet eine vollständige Lösung, und Sie können Ihr eigenes ORM auf Doctrine2 schreiben oder nur eine seiner Ebenen verwenden .

tomp
quelle
Das einzige Problem, an das ich bei Doctrine2 denken kann, ist, dass es von PHP 5.3 und höher abhängt.
jblue
8
@jblue: Es ist kein Problem, es ist eine Funktion ;-). Große Bibliotheken wie Doctrine benötigen Namespaces.
Tom Pažourek
"Viel Magie aus der ursprünglichen Lehre 1 ist verschwunden." - Inwiefern ist das positiv?
Olivier 'Ölbaum' Scherler
13

Ich habe gerade mit Kohana angefangen und es scheint Ruby on Rails am nächsten zu sein, ohne die Komplexität mehrerer Konfigurationsdateien wie bei Propel aufzurufen .

Zak
quelle
Ich stimme auch zu, dass Kohana das Framework ist, das RoR in der PHP-Welt am ähnlichsten ist. Alles, was fehlt, ist ein Gerüst, und mit CLI-Unterstützung in KO3 geht es nur darum, dass jemand die Ärmel hochkrempelt und es tut.
Phillip Whelan
12

Schauen Sie sich Outlet ORM an . Es ist einfacher als Propel und Doctrine und funktioniert ähnlich wie Hibernate, nur mit einem eher PHP-Feeling.

Alvaro
quelle
3
Ich habe es versucht. Ich musste die gleichen Objekteigenschaften an drei Stellen angeben - Konfiguration, Modell und Datenbankschema. Das ist viel Arbeit für die Implementierung einer ORM IMO.
Mixdev
Das Outlet ist sehr konfigurationsintensiv.
Lotus Notes
Ich habe es versucht (1.0 RC1) und es war selbst in der Kernfunktionalität sehr fehlerhaft. Und ja, es gibt viel Konfiguration zum Schreiben. Ich empfehle es nicht.
Szymon Wygnański
11

Ich mag Propel sehr , hier können Sie sich einen Überblick verschaffen, die Dokumentation ist ziemlich gut und Sie können sie über PEAR oder SVN erhalten.

Sie benötigen nur eine funktionierende PHP5-Installation und Phing , um Klassen zu generieren.

CMS
quelle
Propel kann auch ein vorhandenes Datenbankschema zurückentwickeln und PHP-Objekte aus dem Lesen des Datenbankschemas erstellen.
David Goodwin
8

Ich habe ORM-bezogene Klassen in der PHP-Bibliothek Flourish gefunden .

VDVLeon
quelle
6

Geben Sie einen Schuss DORM, ein Objekt Relational - Mapper für PHP 5 . Es unterstützt alle Arten von Beziehungen (1-zu-1), (1-zu-viele), (viele-zu-viele) und Datentypen. Es ist völlig unauffällig: Keine Codegenerierung oder Klassenerweiterung erforderlich. Meiner Meinung nach ist es jedem ORM überlegen, einschließlich Doctrine und Propel. Es befindet sich jedoch noch in der Beta-Phase und könnte sich in den nächsten Monaten erheblich ändern. http://www.getdorm.com

Es hat auch eine sehr kleine Lernkurve. Die drei Hauptmethoden, die Sie verwenden werden, sind:

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

Ich arbeite derzeit an phpDataMapper , einem ORM mit einfacher Syntax wie Rubys Datamapper-Projekt. Es ist noch in der frühen Entwicklung, aber es funktioniert großartig.

Vance Lucas
quelle
4

Ich habe großartige Erfahrungen mit Idiorm und Paris gemacht . Idiorm ist eine kleine, einfache ORM-Bibliothek. Paris ist eine ebenso einfache Active Record-Implementierung, die auf Idiorm basiert. Es ist für PHP 5.2+ mit PDO. Es ist perfekt, wenn Sie etwas Einfaches möchten, das Sie einfach in eine vorhandene Anwendung einfügen können.

Sander Marechal
quelle
4

Versuchte die ORM of Flourish Bibliothek .

eaguilar
quelle
Ja, ich arbeite schon seit einiger Zeit damit. Die Flourishlib ist großartig, aber das ORM hat noch einiges zu tun. Das Erstellen neuer Objekte mit Join-Tabellen mit zusätzlichen Eigenschaften oder Fremdschlüsseln kann etwas mühsam sein. Die Arbeit mit einfachen Modellen ist ein Kinderspiel. In Repose ORM oder Outlet finden Sie ein alternatives ORM für PHP.
Michael
3

Erwarten Sie bis zur Veröffentlichung von PHP 5.3 kein gutes ORM. Es ist eine OO-Einschränkung von PHP.

Knoopx
quelle
Wie würde PHP 5.3 jemandem helfen, ein besseres ORM zu schreiben? Ich sehe keinen Grund.
Ionuț G. Stan
8
Der Hauptgrund ist die Einführung der späten statischen Bindung ("statisches" Schlüsselwort). Lesen Sie darüber auf blog.felho.hu/…
knoopx
2
ORM benötigt keine statischen Variablen, sie können nur mit Instanzvariablen gut entworfen werden.
Tom Pažourek
Richtig, späte statische Bindung ist der Grund, warum ich jede ORM-Instanz meines eigenen ORM so niedrig halten kann . Vor der späten statischen Bindung war es genauso verschwenderisch wie die meisten anderen.
Xeoncross
3

Mein Freund Kien und ich haben eine frühere Version eines ORM verbessert, die er vor PHP 5.3 geschrieben hatte. Wir haben Ruby on Rails ' Active Record im Wesentlichen auf PHP portiert . Es fehlen noch einige wichtige Funktionen wie Transaktionen, Unterstützung für zusammengesetzte Primärschlüssel und einige weitere Adapter (derzeit funktionieren nur MySQL und SQLite 3). Aber wir sind sehr nahe daran, dieses Zeug fertig zu stellen. Sie können sich PHP ActiveRecord mit PHP 5.3 ansehen .

Jacques Fuentes
quelle
3

Versuchen Sie PHP ADOdb.

Ich kann nicht sagen, dass es das Beste ist, weil ich die anderen nicht benutzt habe. Aber es ist schnell, es unterstützt Memcached und Caching.

Und es ist schneller als DB / Select von Zend Framework .

Peter Mortensen
quelle
2
adodb eignet sich eher für das Thin Model / Fat Controller-Aroma, was im Allgemeinen keine gute Sache ist.
jblue
ADOdb hat einen ORM (ist aber nicht nur ein ORM). Es ist im Allgemeinen eine wirklich großartige Lösung. Es funktioniert viel besser als Zend für DB (Zend DB ist nicht nur langsamer als ADOdb, sondern unterstützt nur eingeschränkt JOIN), es unterstützt auch das automatische Escape-Verfahren mit Parametrisierung (im Gegensatz zu Doctrine) und viele verschiedene DB-Backends und hat schönes erweiterbares Caching-Design mit super einfacher Memcache-Integration. Ich denke nicht, dass es überhaupt richtig ist zu sagen, dass es sich für eine "Thin Model / Fat Controller" -Implementierung eignet (Sie können das tun oder nicht, aber das Design von ADOdb bevorzugt nicht die eine oder andere Weise).
Iain Collins
3

Schauen Sie sich das LEAP ORM für Kohana an . Es funktioniert mit einer Reihe von Datenbanken, darunter DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL und SQLite . Mit einer einfachen Autoload-Funktion kann es mit fast jedem PHP-Framework arbeiten. Der Quellcode befindet sich auf GitHub unter https://github.com/spadefoot/kohana-orm-leap . Sie können die LEAP-Tutorials online lesen .

Die ORM-Bibliothek arbeitet mit nicht ganzzahligen Primärschlüsseln und zusammengesetzten Schlüsseln. Verbindungen werden über einen Datenbankverbindungspool verwaltet und funktionieren mit unformatierten SQL-Abfragen. Das ORM verfügt sogar über einen Abfrage-Generator, der das Erstellen von SQL-Anweisungen sehr einfach macht.

Matthew
quelle
2

Sie können sich Ruhe ansehen, wenn Sie sich abenteuerlustig fühlen. Wie Outlet ist es dem Ruhezustand nachempfunden .

Es ist noch sehr früh in seiner Entwicklung, aber bisher bestehen die einzigen Einschränkungen für das Domänenmodell darin, dass die Klassen nicht als endgültig und die Eigenschaften nicht als privat markiert sind. Sobald ich in das Land von PHP> = 5.3 komme, werde ich versuchen, auch die Unterstützung für private Immobilien zu implementieren.

Beau Simensen
quelle
2

Wenn Sie nach einem ORM suchen, der das Data Mapper-Paradigma anstelle von Active Record spezifisch implementiert, würde ich Ihnen dringend empfehlen, sich GacelaPHP anzuschauen .

Gacela Eigenschaften:

  • Datenmapper
  • Fremdschlüsselzuordnung
  • Assoziationszuordnung
  • Abhängige Zuordnung
  • Konkrete Tabellenvererbung
  • Objekt abfragen
  • Metadatenzuordnung
  • Faul & eifrig laden
  • Volle Memcached- Unterstützung

Andere ORM-Lösungen sind zu aufgebläht oder haben lästige Einschränkungen, wenn sie etwas entfernt Kompliziertes entwickeln. Gacela behebt die Einschränkungen des Ansatzes für aktive Datensätze, indem das Data Mapper-Muster implementiert wird, während das Aufblähen auf ein Minimum reduziert wird, indem PDO für alle Interaktionen mit der Datenbank und Memcached verwendet wird.

Noah Goodrich
quelle
2

MicroMVC verfügt über ein 13-KB- ORM , das nur auf einer 8-KB- Datenbankklasse basiert . Es gibt auch alle Ergebnisse als ORM-Objekte selbst zurück und verwendet eine späte statische Bindung, um zu vermeiden, dass Informationen über die Tabelle und die Metadaten des aktuellen Objekts in jedes Objekt eingebettet werden. Dies führt zu dem günstigsten ORM-Overhead, den es gibt.

Es funktioniert mit MySQL , PostgreSQL und SQLite .

Peter Mortensen
quelle
2

Brasilianisches ORM: http://www.hufersil.com.br/lumine . Es funktioniert mit PHP 5.2+. Meiner Meinung nach ist es die beste Wahl für Portugiesen und Brasilianer, da es leicht verständliche Dokumentationen und viele Beispiele zum Herunterladen enthält.

Paulo Araujo
quelle
2

Agile Toolkit verfügt über eine eigene einzigartige Implementierung von ORM / ActiveRecord und dynamischem SQL .

Einführung: http://agiletoolkit.org/intro/1

Syntax (aktiver Datensatz):

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

Syntax (Dynamic SQL):

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

Während Dynamic SQL und Active Record / ORM direkt verwendet werden können, integriert Agile Toolkit sie weiter in die Benutzeroberfläche und die jQuery-Benutzeroberfläche . Dies ähnelt JSF, ist jedoch in reinem PHP geschrieben.

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

Dadurch wird AJAXified CRUD mit für das Mitarbeitermodell angezeigt .

Romaninsh
quelle
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
quelle
2

PHP ORM Faces Für PDO-Erweiterung. Siehe PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Kurt
quelle
1. Seite ist türkisch; 2. Ihr Code unterscheidet sich nicht von dem Code, den Sie beispielsweise mit Doctrine verwenden würden.
Der Pellmeister
1

Schauen Sie sich http://code.google.com/p/lworm/ an . Es ist ein wirklich einfaches, aber leistungsstarkes, leichtes ORM-System für PHP. Sie können es auch einfach erweitern, wenn Sie möchten.

Faz
quelle
1

Ein weiteres großartiges Open Source PHP ORM, das wir verwenden, ist PHPSmartDb . Es ist stabil und macht Ihren Code sicherer und sauberer. Die Datenbankfunktionalität ist zweifellos die einfachste, die ich je mit PHP 5.3 verwendet habe.

Joe
quelle
1

Lehre ist wahrscheinlich die beste Wahl. Vor Doctrine war DB_DataObject im Wesentlichen das einzige andere Dienstprogramm, das Open Source war.

anon
quelle
1

Wenn Sie nach einem ORM wie Hibernate suchen, sollten Sie sich PMO ansehen .

Es kann einfach in eine SOA- Architektur integriert werden (es muss nur eine Webservice-Klasse entwickelt werden).

anonym
quelle