Frage

Ich arbeite eine bestehende PHP-Anwendung auf die Erweiterung. Leider ist für mich, ist die bestehende App ein Chaos. Es ist alles Spaghetti-Code mit rohem mysql_ * Anrufen. Stöhnen. Auf keinen Fall, dass ich das in den Teilen tun werde, dass ich erstrecken.

Also, ich bin auf der Suche nach einem einfachen ORM von DBAL, dass ich einfach in absinken kann und beginnen. Gewünschte Eigenschaften:

  • Sie muss auf einem vorhandenen Datenbankschema arbeiten. Vorzugsweise mit minimaler oder ohne zusätzliche Konfiguration. Das vorhandene Datenbankschema ist die gleiche Qualität wie der bestehenden PHP-Code (keine vernünftigen Namenskonventionen, nicht normalisierte, etc.). Ich möchte nicht, Tage verbringen, um das Datenbankschema Umwandlung manuell in kommentierten Objekteigenschaften a la Doctrine 2.
  • Es muss in der Lage sein, neben den bestehenden rohen mysql_ * Abfragen zu arbeiten. Ich habe keine Ahnung, wie ORMs wie Lehre 2 oder Propel behave feuchtigkeitsspendende, wenn Scripts, die Daten in der Datenbank hinter dem Rücken von Hand manipulieren, aber ich nehme an, es ist nicht schön.
  • Sie muss auf PHP 5.2.x laufen Ich würde Liebe Verwendung von PHP 5.3, aber ich habe null Interesse geht über die bestehenden 125K Linien Spaghetti-Code Chaos um sicherzustellen, dass es läuft auf PHP 5.3.
  • Beziehungen nicht erforderlich. In den wenigen Orten, muß ich auf relationale Daten bekommen, ich werde glücklich sein, ein zusätzliches find() oder query() oder was auch immer, mich anzurufen.
  • Bonuspunkte, wenn es einige Trigger Unterstützung hat (z beforeSave, afterSave). Keine Voraussetzung, aber einfach schön zu haben.

Bearbeiten : Jemand hat mich von meinem Elend heraus. Ich habe gerade herausgefunden, dass die 125K Linien Spaghetti-Code auch das Datenbankschema ändern. Z. B, fügen Sie eine zusätzliche Option irgendwo und eine ganze Reihe von ALTER TABLE-Anweisungen anfangen zu fliegen. Ich könnte wahrscheinlich ein Jahr im Wert von TheDailyWTF mit dieser Code-Basis füllen. Also, eine weitere Anforderung:

  • Muss mit einer sich ändernden Datenbankschema automatisch bewältigen können (zum Beispiel das Hinzufügen von Spalten).

Ich habe ein paar Lösungen gesucht, aber ich bin nicht sicher, wie gut würde sie die Anforderungen gegeben arbeiten. Lehre 2, RedBeanPhp und dergleichen erfordern alle PHP 5.3, so dass sie aus. Es gibt eine ältere Version von RedBeanPhp für PHP 5.2.x, aber ich weiß nicht, ob es mit einem unordentlichen funktionieren würde, bestehendes Datenbankschema. NotORM sieht okay für Daten aus bekommen, aber ich weiß nicht, ob es für das vorhandene Datenbankschema konfiguriert werden kann, und wie Sie Daten auf einfache Weise setzen in die Datenbank zurück.

Im Idealfall würde ich etwas einfach mögen. Z. B:

$user = User::find($id);
$user->name = 'John Woo';
$user->save();

Oder:

$articles = ORM::find('article')->where('date' => '2010-01-01');
foreach ($articles as $article) {
    echo $article->name;
}

Irgendwelche Tipps oder auch alternative Lösungen sind willkommen!

War es hilfreich?

Lösung

I use... http://github.com/j4mie/idiorm/

it has an active record implementation too in the form of Paris.

With regard to your edit. Idiorm copes with changing schemas and the syntax almost exactly matches the type you want in your question.

Andere Tipps

How well did you look into Doctrine? I am using Doctrine 1.2 for these kind of things. Quite easy to setup, allows you to start off with an existing schema. It automatically figures out the relations between tables that have foreign key constraints.

It has extensive trigger and behaviour support, so the bonus points can be spent as well, and it has relational support as well, so your additional queries are not necessary. It has beautiful lazy loading, and it comes with a flexible query language (called DQL) that allows you to do almost exactly the same stuff that you can do in SQL in only a fraction of the effort.

Your example will look like this:

/* To just find one user */
$user = Doctrine::getTable('User')->findOneById($id);

/* Alternative - illustrating DQL */
$user = Doctrine_Query::create()
    ->from('User u')
    ->where('u.id = ?',array($id))
    ->fetchOne();

$user->name = 'John Woo';
$user->save();

It must be able to work alongside the existing raw mysql_* queries. I have no idea how hydrating ORMs like Doctrine 2 or Propel behave when scripts are manually manipulating the data in the database behind their backs, but I assume it's not pretty.

Well, that is technically impossible to auto-manage; a SQL database is simply not pushing back stuff to your ORM, so to update stuff that was changed in the background, you need to perform an additional query one way or the other. Fortunately, Doctrine makes this very easy for you:

/* @var User $user */
/* Change a user using some raw mysql queries in my spaghetti function */
$this->feedSpaghetti($user->id);

/* Reload changes from database */
$user->refresh();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top