PHP ORMs: Doctrine vs. Propel


126

Ich beginne ein neues Projekt mit Symfony, das sich leicht in Doctrine und Propel integrieren lässt , aber ich muss natürlich eine Wahl treffen ... Ich habe mich gefragt, ob erfahrene Leute da draußen allgemeine Vor- und / oder Nachteile haben einer dieser beiden?

Vielen Dank.

EDIT: Danke für all die Antworten, nützliche Sachen. Es gibt keine wirklich richtige Antwort auf diese Frage, daher werde ich nur diejenige als genehmigt markieren, die die beliebtesten Up-Votes erhalten hat.


5
Leute, gibt es aktualisierte Antworten? Zu sehen, dass dieser Weg veraltet ist
Qiniso

Antworten:


76

Ich würde mit Doctrine gehen. Es scheint mir, dass es ein viel aktiveres Projekt ist und als Standard-ORM für Symfony besser unterstützt wird (obwohl die ORMs offiziell als gleich angesehen werden).

Außerdem gefällt mir die Art und Weise, wie Sie mit Abfragen arbeiten (DQL anstelle von Kriterien), besser:

<?php
// Propel
$c = new Criteria();
$c->add(ExamplePeer::ID, 20);
$items = ExamplePeer::doSelectJoinFoobar($c);

// Doctrine
$items = Doctrine_Query::create()
       ->from('Example e')
       ->leftJoin('e.Foobar')
       ->where('e.id = ?', 20)
       ->execute();
?>

(Die Implementierung von Doctrine ist für mich viel intuitiver).

Außerdem bevorzuge ich die Art und Weise, wie Sie Beziehungen in Doctrine verwalten.

Ich denke, diese Seite aus der Doctrine-Dokumentation ist eine Lektüre wert: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Zusammenfassend: Wenn ich ein neues Projekt starten würde oder zwischen Doctrine und Propel wählen müsste, würde ich mich jeden Tag für Doctrine entscheiden.


42
In Propel 1.5 kann diese Abfrage auch als Example_Query :: create () -> joinWith ('FooBar') -> filterId (20) -> find () (oder findPK (20) nach joinWith geschrieben werden, wenn Id Ihre primäre ist Schlüssel). Wie Sie sehen können, übernimmt es die nette Syntax von Doctrine und fügt ein bisschen mehr hinzu. Die Veröffentlichung ist für Ende des ersten Quartals 2010 geplant, Sie können sie jedoch jetzt in Ihren Symfony-Projekten testen.
Jan Fabry

Netter Input, das wusste ich nicht :-)
Phidah

9
Die Umsetzung der Doktrin erscheint mir viel komplexer. Get Entity verwalten Get Repository ... dies und das
SoWhat

1
Die Lehre ist über die Komplikation der Dinge ... nur Notorm ist der richtige Weg
Geomorillo

40

Ich bin voreingenommen, da ich bei der nächsten Version von Propel ein wenig helfe, aber Sie müssen bedenken, dass Propel tatsächlich das erste verfügbare ORM war und dann etwas zurückblieb, als Doctrine erstellt wurde, aber jetzt wieder aktiv entwickelt wird. Symfony 1.3 / 1.4 wird mit Propel 1.4 geliefert, wobei die meisten Vergleiche bei Propel 1.3 enden. Außerdem wird die nächste Version von Propel (1.5) viele Verbesserungen enthalten, insbesondere bei der Erstellung Ihrer Kriterien (was dazu führt, dass Sie weniger Code schreiben müssen).

Ich mag Propel, weil es weniger komplex zu sein scheint als Doctrine: Der meiste Code befindet sich in den wenigen generierten Klassen, während Doctrine die Funktionalität in viele Klassen aufgeteilt hat. Ich möchte ein gutes Verständnis für die Bibliotheken haben, die ich benutze (nicht zu viel "Magie"), aber natürlich habe ich mehr Erfahrung mit Propel, also ist Doctrine hinter den Kulissen vielleicht nicht so kompliziert. Einige sagen, Propel sei schneller, aber Sie sollten dies selbst überprüfen und überlegen, ob dies andere Unterschiede überwiegt.

Vielleicht sollten Sie auch die Verfügbarkeit von Symfony-Plugins für die verschiedenen Frameworks berücksichtigen. Ich glaube, Propel hat hier einen Vorteil, aber ich weiß nicht, wie viele der aufgelisteten Plugins mit der neuesten Version von Symfony noch auf dem neuesten Stand sind.


4
Die neuen Abfrageverbesserungen in Propel 1.5 sind wirklich nett.
Tom

23

Es kommt auf die persönlichen Vorlieben an. Ich benutze Propel, weil ich (unter anderem) die Tatsache mag, dass alles seine eigene konkrete Getter & Setter-Methode hat. In der Lehre ist dies nicht der Fall.

Treiben:

$person->setName('Derek');
echo $person->getName();

Lehre:

$person->name = 'Derek';
echo $person->name;

Der Grund, warum ich Getter & Setter mag, ist, dass ich alle Arten von Logik in sie einfügen kann, wenn ich muss. Aber das ist nur meine persönliche Präferenz.

Ich sollte auch hinzufügen, dass Propel, obwohl es sich in der Vergangenheit nur langsam bewegte, jetzt wieder aktiv entwickelt wird. In den letzten Monaten wurden mehrere neue Versionen veröffentlicht. Die neueste Version von Propel enthält eine "fließende Abfrageoberfläche" ähnlich der von Doctrine , sodass Sie keine Kriterien mehr verwenden müssen, wenn Sie dies nicht möchten.


7
In Doctrine können Sie Setter und Getter für jede Eigenschaft überschreiben und haben auch eine benutzerdefinierte Logik (siehe doctrine-project.org/documentation/manual/1_2/en/… - suchen Sie nach ATTR_AUTO_ACCESSOR_OVERRIDE, um zum entsprechenden Abschnitt zu gelangen)
Marek Karbarz

Das sieht in Ordnung aus, aber Sie legen die Eigenschaft trotzdem fest, indem Sie Folgendes aufrufen: $ x-> propname = 'abc'; Dies ist problematisch, da die Übergabe mehrerer Parameter anscheinend nicht unterstützt wird.
lo_fye

20

Es soll beachtet werden , Lehre 2 ist derzeit in der Entwicklung freigegeben [ed] und Funktionen fast völlig verschieden von der aktuellen stabilen Version von Lehre 1. Es ist auf der Data Mapper Mustern anstelle von Active Record, und verwendet einen ‚Entity Manager‘ auf Griff Ausdauer beruht Logik. Wenn es veröffentlicht wird, ähnelt es eher dem Ruhezustand von Java (Doctrine 1 ähnelt eher dem ActiveRecord von Rails).

Ich habe mich mit der Alpha-Version von Doctrine 2 entwickelt und muss sagen, dass sie über Doctrine 1 liegt (nur meine Meinung, und ich habe Propel noch nie verwendet). Die Chancen stehen gut, dass sich die Doctrine-Community bei ihrer Veröffentlichung darauf zubewegt.

Ich würde Sie ermutigen, sich Doctrine anzuschauen, aber wenn Sie den Active Record-Stil bevorzugen, den Propel und Doctrine jetzt verwenden, möchten Sie vielleicht einfach bei Propel bleiben.


4
Eine stabile Version von Doctrine 2 wurde kürzlich veröffentlicht. doi-project.org/blog/doctrine2-released
Trevor Allred

5

Die beiden Referenzen sind etwas veraltet, so dass Sie dennoch einige allgemeine Aspekte behandeln. Grundsätzlich müssten Sie Ihre Erfahrungen mit dem Framework als solchem ​​bewerten. Ein Hauptnachteil der Doktrin ist die Unfähigkeit, eine IDE zu haben, mit der Sie in diesem Propel automatisch codieren können Als Gewinner sind Lernkurven und Doktrin sehr unterschiedlich. Es ist einfacher zu treiben, wenn Ihr Projekt komplexe Datenmodelle verwalten muss. Verwenden Sie Doktrin, wenn Sie schnell mit einem ORM arbeiten möchten, das am besten dokumentiert ist und mehr Unterstützung in Propel findet Internetnutzung, ist viel ausgereifter und ich glaube, dass die meisten verwendet.

http://propel.posterous.com/propel-141-is-out


In der Symfony-Welt scheint Doctrine definitiv die am häufigsten verwendete zu sein - insbesondere für neuere Projekte. Es gibt natürlich viele SF 1.0-Projekte, die Propel noch verwenden, da Doctrine erst ab 1.1 für Symfony verfügbar war.
Phidah

5

Ich würde vorschlagen, Propel 1.6 zu verwenden, das für die Autocomplete-Funktion von IDE besser ist.


26
-1 Die automatische Vervollständigung einer IDE sollte nicht der Grund für eine technische Entscheidung sein
Clement Herreman

14
@ClementHerreman Ich stimme zu, dass es nicht das Kriterium sein sollte, aber ich glaube, wie produktiv man mit einer bestimmten Technologie sein kann, sollte sicherlich ein Grund für die Wahl sein. Und bei allem Respekt stimme ich Ihrer Ablehnung nicht zu ... unabhängig davon, ob Sie der Antwort zustimmen, ist sie nicht "falsch" (oder?) Und von Nutzen (es sei denn, es ist falsch, in welchem ​​Fall sollten Sie dies angeben).
Sepster

2
IMO: Wenn Ihre Produktivität durch automatische Vervollständigung anstelle von Softwarequalität, Intuitivität und Konsistenz verbessert wird, passiert etwas Seltsames. Siehe Kodierunghorror.com/blog/2009/01/… . Aber Sie haben Recht, irgendwann ist diese Antwort nicht falsch , nur nicht gut genug, vielleicht sogar nicht gut.
Clement Herreman

1
@ClementHerreman, wenn es nicht hilfreich ist, benutze es nicht mehr;), +1
amd

Gibt es aktuelle Antworten darauf? Dies ist weit veraltet.
Qiniso

2

Ich bin kein Benutzer von PHP 5-Nicht-Framework-ORM, aber hier sind einige gute Vergleichspostings (falls Sie sie noch nicht gesehen haben):

http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/

http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine

Beide Schlussfolgerungen bevorzugen Doctrine als neuere Generation von ORM für Symfony.


1
Dieser Vergleich ist völlig veraltet - die aktuelle Version von Propel verwendet PDO, unterstützt viele-zu-viele-Beziehungen und verfügt über eine hervorragende Dokumentation. Erwägenswert: Einige von uns bevorzugen den ausführlichen Abfragestil des Kriterienerstellers gegenüber proprietären Abfragesprachen wie DQL - er unterstützt IDE und ist eine Klasse, sodass Sie ihn erweitern können. Ich versuche immer noch zu wählen, aber ich sehe viele Pluspunkte für Propel over Doctrine, wenn Sie nichts dagegen haben, statischen Code zu generieren, und die Vorteile von "echtem" PHP-Code im Gegensatz zu proprietärer Abfragesprache erkennen können Dies ist nur eine Zeichenfolge für eine IDE.
mindplay.dk

2

Nachdem ich beide einige Jahre lang verwendet habe, bevorzuge ich Propel 2 gegenüber Doctrine, einfach basierend darauf, wie Sie Ihre Abfragelogik erstellen. Die Lehre ist so tief wie möglich und die Verwaltung vieler Aspekte entspricht dieser Tiefe. Ich bin der Meinung, dass Propel eine flüssigere und objektorientiertere Methode zum Erstellen und Verwalten der Abfrageinteraktionen bietet.

Für mich führte dies zu weniger Code im Modell und mehr Strukturen, wie Logik verarbeitet werden kann / wird. Dies führte dazu, dass nur viele Interaktionen als gemeinsame Funktionalität aufgebaut wurden. (Immerhin werden 90% von dem, was Sie mit einer Datenbank machen werden, nur ein gewisser Grad an Rohbetrieb sein.)

Am Ende sind beide leistungsstark, überschaubar und erledigen die Arbeit. Meine persönlichen Projekte und Interessen verwenden Propel ORM 2 und zukünftige Projekte, wenn sie noch in PHP geschrieben sind, werden diesen Weg gehen.

Ich benutze beide seit 3-4 Jahren täglich.


1

Ich würde vorschlagen, das DbFinder Plugin zu verwenden . Dies ist eigentlich ein sehr leistungsfähiges Plugin, das beides unterstützt und ein ziemlich leistungsfähiges Plugin ist. Ich benutze es eigentlich besser als beide.


@ Mike: danke, wusste nichts über das Plugin, scheint aber nur bis zu Sf1.2 zu unterstützen. Am Ende habe ich mich für Doctrine entschieden. Ich glaube, es war die richtige Wahl, obwohl das Schreiben von direktem SQL für die komplexeren Dinge erforderlich ist.
Tom

-2

Wenn ich mich nicht irre, verwenden beide ORMs ein XML-basiertes Schema, und das Erstellen dieser Schemadefinition ist ziemlich umständlich. Wenn Sie ein PHP-basiertes einfaches Schema mit fließendem Stil benötigen. Sie können LazyRecord https://github.com/c9s/LazyRecord ausprobieren. Es unterstützt automatische Migrations- und Upgrade- / Downgrade- Skriptgeneratoren . Alle Klassendateien werden statisch ohne Laufzeitkosten generiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.