web-dev-qa-db-ja.com

PHP ORMs:Doctrine vs. Propel

symfony で新しいプロジェクトを開始しています。これは Doctrine および Propel と簡単に統合できますが、もちろん選択する必要があります。 ..これらの2つのいずれかを使用するための一般的な長所と短所があるかどうか、より経験豊富な人々がいるのだろうかと思っていましたか?

どうもありがとう。

EDIT:すべての回答、有用なものをありがとう。この質問に対する真の正しい答えはありませんので、最も人気のあるアップ投票を得たものを承認済みとしてマークします。

126
Tom

私はDoctrineで行きます。それははるかにアクティブなプロジェクトであり、symfonyのデフォルトのORMであるように思われます(公式にはORMは同等と見なされますが)。

さらに、クエリ(Criteriaの代わりにDQL)を使用する方法が好きです:

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

(Doctrineの実装は私にとってはるかに直感的です)。

また、Doctrineでリレーションを管理する方法が本当に好きです。

Doctrineドキュメンテーションは読む価値があります: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-説明

要約すると、新しいプロジェクトを開始していた場合、または学習DoctrineとPropelを選択する必要があった場合は、いつでもDoctrine.

76
phidah

私はPropelの次のリリースで少し助けているのでバイアスがかかっていますが、Propelが実際に利用可能な最初のORMであり、Doctrineが作成されたときに少し遅れましたが、 Symfony 1.3/1.4にはPropel 1.4が付属しており、ほとんどの比較はPropel 1.3で止まります。また、Propel(1.5)の次のリリースには、特にCriteriaの作成(多くの場合、あなたが書くためのコード)。

PropelはDoctrineよりも複雑ではないように見えるため、私はPropelが好きです:ほとんどのコードは少数の生成されたクラスにありますが、Doctrineは多くのクラスで機能を分割しました。私が使用しているライブラリの(あまり「魔法」ではない)ですが、もちろん、Propelの経験が豊富なので、多分Doctrineは舞台裏でそれほど複雑ではありません。より高速ですが、これを自分で確認し、他の違いを上回るかどうかを検討する必要があります。

たぶん、異なるフレームワークのSymfonyプラグインの可用性も考慮する必要があります。ここでPropelには利点があると思いますが、Symfonyの最新バージョンでリストされているプラ​​グインの数がまだ最新かどうかはわかりません。

40
Jan Fabry

それは個人的な好みに帰着します。 (特に)Propelを使用するのは、すべてに独自の具体的なgetter&setterメソッドがあるという事実が好きだからです。 Doctrineでは、そうではありません。

推進、動かす:

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

教義:

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

ゲッターとセッターを使用するのが好きな理由は、必要に応じてあらゆる種類のロジックを入れることができるからです。しかし、それは私の個人的な好みです。

また、Propelは以前は動きが鈍かったが、現在も活発に開発が進められていることを付け加えるべきです。過去数か月でいくつかの新しいバージョンをリリースしました。 Propelの最新バージョンにはDoctrineに似た "流れるようなクエリインターフェイス"が含まれているため、必要ない場合はCriteriaを使用する必要はありません。

22
lo_fye

注意してください Doctrine 2 は 現在開発中リリース済み [ed]およびDoctrineの現在の安定バージョンとはほぼ完全に機能します。1。Active RecordではなくData Mapperパターンに依存し、「エンティティマネージャー」を使用して永続ロジックを処理します。リリース時には、JavaのHibernateによく似ています(Doctrine 1はRailsのActiveRecordに似ています)。

私はDoctrine 2のアルファリリースで開発しており、それはDoctrine 1の頭と肩だと言わなければなりません(私の意見だけで、私はPropelを使用したことがありません)。 Doctrineコミュニティがリリースされると、それに向かって移動する可能性が高くなります。

Doctrineをチェックアウトすることをお勧めしますが、PropelとDoctrineが現在使用しているActive Recordスタイルを好む場合は、Propelに固執することをお勧めします。

20
Bryan M.

IDEのオートコンプリート機能に適したpropel 1.6を使用することをお勧めします。

5
petkopara

2つの参照はやや時代遅れなので、いくつかの一般性をカバーしていますが、基本的にフレームワークでの経験を評価する必要があります。doctrineの主な欠点はIDE propelが勝者であり、学習曲線propelとdoctrine_は非常に異なるため、自動コード化できます。最もよく文書化されているORMを使用して迅速に作業し、Propelインターネットの使用でより多くのサポートを見つけたいと思っています。

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

5

両方を数年間使用した後、Propel 2よりもDoctrineクエリロジックの構築方法に基づいています。DoctrineはPropelには、クエリの対話を構築および管理するための、より流動的でオブジェクト駆動型の方法があると感じています。

私にとってこれは、モデル内のコードの削減と、ロジックの処理方法/処理方法に関する構造の増加につながりました。これにより、多くの相互作用を共通の機能として構築することになりました。 (結局、データベースで行うことの90%は、ある程度の粗雑な操作になります。)

最終的には、両方とも強力で管理しやすく、仕事を成し遂げます。私の個人的なプロジェクトと関心は、Propel ORM 2と将来のプロジェクトを使用します。まだPHPで書かれている場合、そのルートに行きます。

私は過去3〜4年間、両方を毎日使用しています。

2
Ryan Rentfro

私はPHP 5非フレームワークORMのユーザーではありませんが、いくつかの優れた比較投稿があります(まだ見たことがない場合):

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

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

両方の結論は、Doctrine= SymfonyのORMの新世代としてのお気に入りです。

2
Trav L

DbFinder Plugin を使用することをお勧めします。これは実際には両方をサポートする非常に強力なプラグインであり、非常に強力です。私は実際にどちらよりもそれを使うのが好きです。

1
Mike Crowe