Domanda

Sto lavorando per estendere un'applicazione PHP esistente. Purtroppo per me, l'applicazione esistente è un casino. E 'tutto il codice di spaghetti con le chiamate cruda mysql_ *. Gemito. Non c'è modo che ho intenzione di farlo nelle parti che mi rivolgo.

Quindi, io sono alla ricerca di un semplice ORM di DBAL che posso facilmente cadere in e iniziare a utilizzare. caratteristiche desiderate:

  • Si deve lavorare su uno schema di database esistente. Preferibilmente con minima o nessuna configurazione aggiuntiva. Lo schema del database esistente è la stessa qualità del codice esistente PHP (senza convenzioni di denominazione sensibili, non normalizzato, ecc). Non voglio trascorrere giornate conversione manualmente lo schema del database in proprietà degli oggetti annotati alla Dottrina 2.
  • Deve essere in grado di lavorare a fianco le prime mysql_ * query esistenti. Non ho idea di come idratante ORM come Doctrine 2 o Propel si comportano quando gli script stanno manipolando manualmente i dati nel database dietro le spalle, ma suppongo che non è abbastanza.
  • Si deve essere eseguito su PHP 5.2.x. Mi piacerebbe amore di utilizzare PHP 5.3 ma non ho interesse zero in andando oltre le attuali linee di 125K pasticcio spaghetti code per assicurarsi che gira su PHP 5.3.
  • I rapporti non richiesta. Nei pochi luoghi che ho bisogno di arrivare a dati relazionali, sarò felice di chiamare un find() extra o query() o qualsiasi altra cosa io stesso.
  • punti
  • Bonus se ha qualche supporto di innesco (ad esempio beforeSave, afterSave). Non è un requisito, ma solo bello avere.

Modifica : Qualcuno mi ha messo fuori dalla mia miseria. Ho appena scoperto che i 125K righe di codice di spaghetti cambia anche lo schema del database. Per esempio, aggiungere un qualche opzione in più e tutta una serie di istruzioni ALTER TABLE cominciano a volare. Probabilmente potrei riempire un intero anno di TheDailyWTF con questo codebase. Così, un altro requisito:

  • Deve essere in grado di far fronte a uno schema di database che cambia automaticamente (ad esempio l'aggiunta di colonne).

Sono stato guardando un paio di soluzioni, ma sono sicuro quanto bene avrebbe funzionato dato i requisiti. Doctrine 2, RedBeanPhp e simili tutti richiedono PHP 5.3, in modo che siano fuori. C'è una versione precedente di RedBeanPhp per PHP 5.2.x, ma non so se avrebbe funzionato con un disordinato, schema di database esistente. NotORM sembra a posto per ottenere i dati fuori, ma non so se può essere configurato per lo schema di database esistente, e come i dati si può facilmente mettere nel database.

Idealmente vorrei qualcosa di semplice. Per esempio:

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

o

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

Tutte le punte o anche soluzioni alternative sono i benvenuti!

È stato utile?

Soluzione

Io uso ... http://github.com/j4mie/idiorm/

ha un'implementazione record attivo anche sotto forma di Parigi.

Per quanto riguarda la modifica. Idiorm la cava con schemi che cambiano e la sintassi corrisponde quasi esattamente il tipo che si desidera nella sua interrogazione.

Altri suggerimenti

Come bene hai guardato in dottrina? Sto usando Doctrine 1.2 per questo genere di cose. Abbastanza facile da installare, permette di iniziare con uno schema esistente. Si calcola automaticamente le relazioni tra tabelle che hanno vincoli di chiave esterna.

Si ha una vasta grilletto e supporto comportamento, in modo che i punti bonus possono essere spesi come bene, e ha il supporto relazionale come pure, in modo che le query aggiuntive non sono necessari. Ha bello lazy loading, e viene fornito con un linguaggio di interrogazione flessibile (chiamato DQL) che ti permette di fare quasi esattamente le stesse cose che si può fare in SQL in solo una frazione dello sforzo.

Il vostro esempio sarà simile a questa:

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

Si deve essere in grado di lavorare a fianco le prime mysql_ * query esistenti. Non ho idea di come idratante ORM come Doctrine 2 o Propel si comportano quando gli script stanno manipolando manualmente i dati nel database dietro le spalle, ma suppongo che non è abbastanza.

Bene, che è tecnicamente impossibile da auto-gestire; un database SQL non è semplicemente spingendo roba di nuovo al vostro ORM, per così roba aggiornamento che è stato cambiato in background, è necessario eseguire un modo di query un ulteriore o l'altro. Fortunatamente, Doctrine rende molto facile per voi:

/* @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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top