Question

Je travaille sur l'extension d'une application PHP existante. Malheureusement pour moi, l'application existante est un gâchis. Il est tout le code spaghetti avec des appels mysql_ raw *. Gémissement. Pas moyen que je vais faire dans les parties que je tends.

Alors, je cherche simplement ORM de DBAL que je peux facilement tomber et commencer à utiliser. caractéristiques souhaitées:

  • Il doit travailler sur un schéma de base de données existante. De préférence avec un minimum ou aucune configuration supplémentaire. Le schéma de base de données existante est la même qualité que le code PHP existant (pas de conventions de dénomination sensibles, non normalisés, etc.). Je ne veux pas passer des jours convertir le schéma de base de données manuellement dans les propriétés d'objet annotés à la Doctrine 2.
  • Il doit être capable de travailler avec les premières mysql_ existantes * requêtes. Je ne sais pas comment comme Doctrine ORM hydratant 2 ou lorsque les scripts se comportent Propel manipulent manuellement les données dans la base de données derrière le dos, mais je suppose que ce n'est pas assez.
  • Il doit fonctionner sur PHP 5.2.x. Je l'amour pour utiliser PHP 5.3, mais j'ai aucun intérêt à aller sur les lignes existantes 125K de désordre de code spaghetti pour vous assurer qu'il fonctionne sur PHP 5.3.
  • Relations pas nécessaire. Dans les rares endroits où je besoin d'obtenir des données relationnelles, je serai heureux d'appeler un find() supplémentaire ou query() ou quoi que moi-même.
  • Les points de bonus si elle a un soutien de déclenchement (par exemple beforeSave, afterSave). Pas besoin, mais juste agréable d'avoir.

Modifier : Quelqu'un m'a mis hors de ma misère. Je viens de découvrir que les 125K lignes de code spaghetti modifie également le schéma de base de données. Par exemple, ajouter une option quelque part supplémentaire et toute une série de ALTER TABLE commencent à voler. Je pourrais probablement remplir la valeur d'une année de TheDailyWTF avec ce code de base. Ainsi, une plus exigence:

  • doit être en mesure de faire face à une (par exemple l'ajout de colonnes) automatiquement le schéma de base de données changeant.

J'ai cherché à quelques solutions, mais je ne suis pas sûr à quel point elles travailleraient compte tenu des exigences. Doctrine 2, RedBeanPhp et comme tous exigent PHP 5.3, donc ils sont sortis. Il y a une ancienne version de RedBeanPhp pour PHP 5.2.x, mais je ne sais pas si cela fonctionnerait avec un désordre, le schéma de base de données existante. NotORM semble correct pour obtenir des données sur mais je ne sais pas s'il peut être configuré pour le schéma de base de données existante, et comment vous pouvez facilement les données remettre dans la base de données.

Idéalement je voudrais quelque chose simple. Par exemple:

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

Ou:

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

Des conseils ou même d'autres solutions sont les bienvenues!

Était-ce utile?

La solution

J'utilise ... http://github.com/j4mie/idiorm/

il a une mise en œuvre d'enregistrement actif aussi sous la forme de Paris.

En ce qui concerne votre édition. Idiorm se débrouille avec des schémas changeants et la syntaxe correspond presque exactement le type que vous voulez dans votre question.

Autres conseils

Comment avez vous regardez dans la doctrine? J'utilise Doctrine 1.2 pour ce genre de choses. Très facile à installer, vous permet de commencer avec un schéma existant. Il détermine automatiquement les relations entre les tables qui ont des contraintes de clés étrangères.

Il a déclencheur étendu et le soutien du comportement, de sorte que les points de bonus peuvent être dépensés aussi bien, et il a un support relationnel ainsi, afin que vos requêtes supplémentaires ne sont pas nécessaires. Il a beau chargement paresseux, et il est livré avec un langage de requête flexible (appelée DQL) qui vous permet de faire presque exactement la même chose que vous pouvez faire dans SQL en une fraction seulement de l'effort.

Votre exemple ressemblera à ceci:

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

Il doit être capable de travailler avec les premières mysql_ existantes * requêtes. Je ne sais pas comment comme Doctrine ORM hydratant 2 ou lorsque les scripts se comportent Propel manipulent manuellement les données dans la base de données derrière le dos, mais je suppose que ce n'est pas assez.

Eh bien, ce qui est techniquement impossible d'auto-gestion; une base de données SQL est tout simplement pas pousser des trucs à votre ORM, pour ainsi mettre à jour des choses qui a été changé en arrière-plan, vous devez effectuer un moyen supplémentaire d'une requête ou de l'autre. Heureusement, la doctrine rend cela très facile pour vous:

/* @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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top