PHP ORM:DoctrineとPropel


126

私はsymfonyで新しいプロジェクトを始めています。これはDoctrinePropelと簡単に統合できますが、もちろん選択をする必要があります。これら二つのどちらか?

どうもありがとう。

編集: すべての応答、便利なものをありがとう。この質問に対する正しい答えはないので、最も人気のある投票を獲得した質問を承認済みとしてマークします。


5
皆さん、更新された応答はありますか?この方法が古くなっているのを見る
Qiniso

回答:


76

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

さらに、クエリの操作方法(基準ではなく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-explained

要約すると、もし私が新しいプロジェクトを始めるか、DoctrineとPropelのどちらを学ぶかを選ばなければならない場合、私はいつでもDoctrineに行きます。


42
Propel 1.5では、このクエリはExample_Query :: create()-> joinWith( 'FooBar')-> filterId(20)-> find()(またはidがプライマリの場合はjoinWithの後にfindPK(20))として書くこともできますキー)。ご覧のとおり、Doctrineの優れた構文を使用し、もう少し追加しています。リリースは2010年の第1四半期の終わりを予定していますが、Symfonyプロジェクトでテストできます。
Jan Fabry

素晴らしい入力、私はそれを知らなかった:-)
phidah

9
教義の実装は私にははるかに複雑に思えます。エンティティを取得リポジトリを取得...これとそれ
SoWhat

1
教義は、物事を複雑に超えている...ちょうどnotormが進むべき道である
Geomorillo

40

Propelの次のリリースで少し手助けをするので、私は偏見がありますが、Propelが確かに最初の利用可能なORMであり、Doctrineが作成されたときに少し遅れていたが、再びアクティブな開発が行われたことを考慮する必要があります。symfony 1.3 / 1.4にはPropel 1.4が付属しており、ほとんどの比較はPropel 1.3で終了します。また、Propelの次のリリース(1.5)には、特にCriteriaの作成において、多くの改善が含まれます(その結果、作成するコードが少なくなります)。

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

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


4
Propel 1.5での新しいクエリの改善は本当に素晴らしいです。
トム

23

それは個人的な好みに帰着します。(とりわけ)すべてが独自の具体的なゲッターとセッターメソッドを持っているという事実が好きなので、私はPropelを使用します。Doctrineでは、これはそうではありません。

推進、動かす:

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

教義:

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

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

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


7
Doctrineでは、各プロパティのセッターとゲッターをオーバーライドでき、カスタムロジックも使用できます(doctrine-project.org/documentation/manual/1_2/en/…-ATTR_AUTO_ACCESSOR_OVERRIDEを検索して関連セクションに移動します)
Marek Karbarz

これで問題はないように見えますが、次のように呼び出してプロパティを設定します。$ x-> propname = 'abc'; 複数のパラメータの受け渡しをサポートしていないように見えるため、これには問題があります。
lo_fye 2010年

20

Doctrine 2現在開発 リリース [ed]であり、Doctrine 1の現在の安定バージョンとはほぼ完全に機能が異なることに注意してください。ActiveRecordではなくData Mapperパターンに依存し、「エンティティーマネージャー」を使用して永続性を処理します論理。リリースされると、JavaのHibernateによく似たものになります(Doctrine 1はRailsのActiveRecordに似ています)。

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

Doctrineをチェックすることをお勧めしますが、PropelとDoctrineが現在使用しているアクティブレコードスタイルを好む場合は、Propelをそのまま使用することをお勧めします。


4
Doctrine 2の安定版が最近リリースされました。doctrine-project.org/blog/doctrine2-released
Trevor Allred、2011年

5

2つの参照はやや古くなっているため、一般性についてはカバーしますが、基本的にはフレームワークでの経験を評価する必要があります。Doctrineの主な欠点は、そのpropelで自動コーディングできるIDEを使用できないことです。勝者、学習曲線の推進と教義は非常に異なります。プロジェクトが複雑なデータモデルを管理する必要がある場合、ドクトリンを使用して、ドキュメント化されたORMですばやく作業し、Propelでより多くのサポートを見つけたい場合は、推進が容易ですインターネットの使用ははるかに成熟しており、最も使用されていると思います。

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


symfonyの世界では、Doctrineは間違いなく最も使用されているようです-特に新しいプロジェクトでは。もちろん、Doctrineが1.1までsymfonyで利用できなかったため、まだPropelを使用している多くのsf 1.0プロジェクトがあります。
phidah

5

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


26
-1 IDEのオートコンプリートが技術的な選択の理由であってはならない
Clement Herreman 2012

14
@ClementHerreman私は、それはすべきではない同意する基準が、私は確かにする必要があり、特定の技術とすることができますどのように生産性を1と信じて、それを選択した理由。そして、すべての敬意をもって私はあなたの投票に同意しません...回答に同意するかどうかに関係なく、それは「間違っている」(またはそうではありません)のではなく、それは何らかの意味があります(間違っている場合を除きます)。 、これを明記する必要があります)。
Sepster 2012

2
IMOソフトウェアの品質、直感性、一貫性の代わりにオートコンプリートによって生産性がさらに向上する場合、奇妙なことが起こっています。codinghorror.com/blog/2009/01/…を参照してください。しかし、あなたの言うとおり、ある時点でこの答えは間違っていません。
クレメントエレマン2012

1
@ClementHerreman、役に立たない場合はもう使用しないでください;)、+1
amd

これに対する最新の応答はありますか?これは時代遅れです。
Qiniso、2015年

2

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

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

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

SymfonyのORMの新世代としてのDoctrineに対するお気に入りの結論です。


1
記録のために、この比較は完全に時代遅れです-Propelの現在のバージョンはPDOを使用し、多対多の関係のサポートを使用し、素晴らしいドキュメントを持っています。また、検討する価値があります。私たちの中には、DQLのような独自のクエリ言語よりも詳細な基準ビルダークエリスタイルを好む人もいます。IDEをサポートしており、クラスなので、拡張できます。私はまだ選択を試みていますが、静的なコード生成を気にせず、独自のクエリ言語とは対照的に「実際の」PHPコードの利点を見ることができる場合、DoctrineではなくPropelの多くのプラスが見られます、これはIDEへの単なる文字列です。
mindplay.dk

2

何年にもわたって両方を使用した後、私は単純にクエリロジックの構築方法に基づいて、DoctrineよりもPropel 2を好みます。Doctrineは、その深さのレベルに一致する多くの側面を取得および管理できるのと同じくらい深さです。Propelには、クエリの相互作用を構築および管理するための、より流動的でオブジェクト主導の方法があると感じています。

私にとっては、これによりモデル内のコードが減り、ロジックの処理方法や処理方法に関する構造が増えました。これにより、多くのインタラクションが共通の機能として構築されました。(結局のところ、データベースで行うことの90%は、ある程度のクラッド操作になるだけです。)

結局のところ、どちらも強力で管理しやすく、仕事を成し遂げるでしょう。私の個人的なプロジェクトと興味は、Propel ORM 2と将来のプロジェクトを使用しますが、PHPでまだ記述されている場合は、その道を進みます。

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


1

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


@マイク:ありがとう、プラグインについては知りませんでしたが、Sf1.2までしかサポートしていないようです。最終的にDoctrineを使用することになりましたが、それは正しい選択だったように感じますが、より複雑なものには直接SQLを記述する必要があります。
トム

-2

私が間違っていなければ、両方のORMがXMLベースのスキーマを使用しており、これらのスキーマ定義の作成はかなり面倒です。流暢なスタイルのPHPベースの単純なスキーマが必要な場合。自動移行とアップグレード/ダウングレードスクリプトジェネレーターをサポートするLazyRecord https://github.com/c9s/LazyRecordを試すことができます。また、すべてのクラスファイルはランタイムコストなしで静的に生成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.