ORMs PHP: Doctrine vs. Propel

je commence un nouveau projet avec symfony qui est facilement intégré avec Doctrine et Propel , mais je dois bien sûr faire un choix.... Je me demandais si les gens plus expérimentés là-bas ont des avantages et/ou des inconvénients généraux pour aller avec l'un de ces deux?

Merci beaucoup.

EDIT: Merci pour toutes les réponses, des trucs utiles. Il n'y a pas de réponse vraiment correcte à cette question donc je vais juste marquer comme approuvé celui qui a obtenu les plus populaires up-votes.

123
demandé sur Mohammad Ali Akbari 2010-01-14 08:59:35

10 réponses

je dirais Doctrine. Il me semble que c'est un projet beaucoup plus actif et étant L'ORM par défaut pour symfony il est mieux supporté (même si officiellement les ORMs sont considérés égaux).

en outre, je préfère la façon dont vous travaillez avec les requêtes (DQL au lieu de critères):

<?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();
?>

(la mise en œuvre de la Doctrine est beaucoup plus intuitive pour moi).

aussi, je préfère vraiment la façon dont vous gérez les relations en Doctrine.

je pense que cette page de la Documentation sur la Doctrine vaut la peine d'être lue: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

pour résumer: si je commençais un nouveau projet ou si je devais choisir entre Apprendre La Doctrine et propulser, j'irais pour la Doctrine n'importe quel jour.

73
répondu phidah 2010-01-14 06:51:06

je suis partial, puisque j'aide un peu sur la prochaine libération de Propel, mais vous devez considérer que Propel était en effet le premier ORM disponible, puis un peu décalé lorsque la Doctrine a été créée, mais a maintenant le développement actif à nouveau. Symfony 1.3 / 1.4 est fourni avec le propulseur 1.4, où la plupart des comparaisons s'arrêtent au propulseur 1.3. En outre, la prochaine version de Propel (1.5) contiendra beaucoup d'améliorations, en particulier dans la création de vos critères (résultant en moins de code à écrire).

J'aime Propel parce qu'il semble être moins complexe que la Doctrine: la plupart du code est dans les quelques classes générées, tandis que la Doctrine a divisé la fonctionnalité dans beaucoup de classes. J'aime avoir une bonne compréhension des bibliothèques que j'utilise (pas trop "magique"), mais bien sûr, j'ai plus d'expérience avec Propel, alors peut-être que la Doctrine n'est pas si compliqué derrière les coulisses. Certains disent que le propulseur est plus rapide, mais vous devriez vérifier cela pour vous-même, et de considérer si cela l'emporte sur d'autres différence.

peut-être que vous devriez également considérer la disponibilité de plugins Symfony pour les différents cadres. Je pense que Propel a un avantage ici, mais je ne sais pas combien des plugins listés sont encore à jour avec la dernière version de Symfony.

39
répondu Jan Fabry 2010-01-14 09:23:59

il s'agit de préférence personnelle. J'utilise Propel parce que (entre autres choses) j'aime le fait que tout a sa propre méthode béton getter & setter. Dans la Doctrine, ce n'est pas le cas.

propulser:

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

Doctrine:

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

la raison pour laquelle j'aime avoir getters & setters est que je peux y mettre toutes sortes de logique, si j'en ai besoin. Mais c'est juste ma préférence personnelle.

je dois également ajouter que bien que Propel se déplaçait lentement dans le passé, il est maintenant en développement actif à nouveau. Il a publié plusieurs nouvelles versions au cours des derniers mois. La version la plus récente de Propel comprend une "interface de requête fluide" similaire à la Doctrine , de sorte que vous ne devez plus utiliser de critères si vous ne voulez pas.

21
répondu lo_fye 2010-01-14 19:59:36

Il convient de noter Doctrine 2 est actuellement en cours de développement libéré [ed] et des fonctions presque complètement différente de la version stable actuelle de la Doctrine 1. Il s'appuie sur le modèle Data Mapper au lieu de Active Record, et utilise un "gestionnaire d'entity" pour gérer la logique de persistance. Lorsqu'il sera publié, il ressemblera davantage à L'hibernation de Java (La Doctrine 1 est plus proche des Rails). ActiveRecord).

j'ai développé avec la version alpha De La Doctrine 2, et je dois dire que c'est têtes et épaules au-dessus de la Doctrine 1 (juste mon opinion, et je n'ai jamais utilisé Propel). Il y a de bonnes Chances que la communauté de la Doctrine se rapprochera de celle-ci lorsqu'elle sera libérée.

je vous encourage à vérifier la Doctrine, mais si vous préférez le style de dossier actif qui propulse et la Doctrine utilisent maintenant, vous pourriez vouloir simplement coller avec le propulseur.

20
répondu Bryan M. 2011-06-01 08:48:58

les deux références sont quelque peu dépassées donc vous couvrez néanmoins quelques généralités, fondamentalement vous auriez à évaluer votre expérience avec le cadre en tant que tel, un inconvénient majeur à la doctrine est l'incapacité d'avoir un IDE qui vous permet Auto-code dans ce propulseur est un vainqueur, les courbes d'apprentissage propulsent et la doctrine sont très différentes, il est plus facile de propulser, si votre projet aura besoin de gérer des modèles de données complexes utilise la doctrine, si vous voulez travailler rapidement avec un ORM qui est le meilleur documenté et trouver plus de soutien dans les utilisations Propel Internet, est beaucoup plus mature et je crois que le plus utilisé.

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

5
répondu Mauricio Herrán 2010-01-14 06:35:38

je suggère d'utiliser propel 1.6 ce qui est mieux pour la fonction autocomplete D'IDE.

5
répondu petkopara 2016-02-28 09:36:10

Je ne suis pas un utilisateur de PHP 5 non-framework ORM, Mais voici quelques bons messages de comparaison (au cas où vous ne les avez pas encore vus):

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

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

les deux conlusion favorite vers la Doctrine comme une nouvelle génération D'ORM pour Symfony.

2
répondu Trav L 2010-01-14 06:18:48

je suggérerais d'utiliser Dbfinder Plugin . C'est en fait un plugin très puissant qui supporte les deux, et est assez puissant. En fait, j'aime l'utiliser mieux que ce soit.

1
répondu Mike Crowe 2010-04-07 01:51:19

après avoir utilisé les deux pendant un certain nombre d'années, je préfère Propel 2 à la Doctrine simplement basée sur la façon dont vous construisez votre logique de requête. La Doctrine est aussi approfondie qu'elle peut l'être et la gestion de nombreux aspects de la TI correspond à ce niveau de profondeur. Propel I feel a une façon plus fluide et orientée objet de construire et de gérer les interactions requête.

pour moi, cela a conduit à moins de code dans le modèle et plus de structures autour de la façon dont la logique peut/sera traitée. Cela a entraîné dans seulement construire de nombreuses interactions en tant que fonctionnalité commune. (Après tout 90% de ce que vous ferez avec une base de données sera juste un certain degré d'opération crud.)

au bout du compte, les deux sont puissants, gérables et feront le travail. Mes projets personnels et d'intérêt utilisent Propel ORM 2 et les projets futurs, si encore écrit en PHP va dans cette voie.

j'ai utilisé les deux sur une base quotidienne pour les 3-4 dernières années.

0
répondu Ryan Rentfro 2018-08-05 20:35:11

si Je ne me trompe pas, les deux ORM utilisent un schéma basé sur XML, et la création de ces définitions de schéma est assez compliquée. Si vous avez besoin D'un schéma simple basé sur PHP avec un style fluide. Vous pouvez essayer LazyRecord https://github.com/c9s/LazyRecord il prend en charge la migration automatique et les générateurs de script de mise à niveau/déclassement. Et tous les fichiers de classe sont générés statiquement sans frais d'exécution.

-3
répondu c9s 2016-06-20 03:55:20