tl; dr:私は長い間Doctrineを使用していましたが、何か新しいことを始めなければならない場合はPropelを選択します。
これは非常に一般的な質問であり、ほとんど良い答えはありません。しかし、私はあなたに私の見解を与えるだけです。
私は最初のアルファ(そして古いsymfony 0.63)以来Doctrineと協力してきました。DoctrineはPDO(PHPにネイティブ)をサポートし、PropelはまだCreole(ネイティブではない)で実行されていたため、PropelではなくDoctrineを選択しました。クレオールはPDOと比較して非常に遅かった(もちろん)。
最近、Doctrineは魔法の喪失を追加しました。getField
つまり、あなたはすべてのために、と呼ぶことができfindOneByField
、それはあなたが望むものを返すでしょう。独自のゲッターとセッターを作成する代わりに、それは本当に素晴らしいものでした。当時、魔法は本当に流行っていました。
Doctrineを使用してクエリを作成するのは、非常に冗長なPropelの苦痛なCriteriaとCriterionの代わりに、非常に簡単でした。私はDoctrineのファンであり、Propelの代わりにDoctrineを使い始めることをすべての人に勧めました。
その後、Propelは1.3からPDOに切り替え、Doctrineとほぼ同じアプローチでクエリを作成するための優れたAPIを使用できるようになりました。主な違いは、 Doctrineがオンザフライで構築されている間、Propelはすべての魔法のものを生成することでした。それが私が思う最大の違いです。
Propelにはこのコードに魔法はありません。モデルを構築すると、すべてのゲッター/セッター、結合などが生成されます。Doctrineはクエリを実行するときにすべてのことを行います。これは中小規模のプロジェクトでは問題ありませんが、大きくなり始め、遅い解決策になります。また、生成されたクラスでコードを見つけるため、デバッグにも最適です。この場合を処理するグローバルメソッドを見つけるために、クラスからクラスにジャンプする必要はありません。
どちらのORMも動作を使用します。私は行動が大好きです。それらはDoctrineとPropelでは異なる方法で処理されます。Doctrineは依然としてその魔法を使用して、Propelがクラス内の動作からすべてを生成する場所でそれらを処理します(魔法のクラスではなく、生成されたクラスからもう1つのポイント)。
現在のところ、1.2.xブランチがほとんど死んでいるため(前回のリリースは2010年8月24日)。githubで見ることができるように、Propelはまだアクティブで、本当にアクティブです。
私はまだDoctrineを使用していますが、数年前からPropelから多くのことを学びました。私はDoctrineでいくつかの個人的なプロジェクトを構築しました。今日の時点で気が変わったので、新しいプロジェクトを開始する必要がある場合は、Propelを使用して行います。
いくつかのリンク: