2012-01-12 11 views
6

私はCodeIgniterのActive Recordが本当に好きで、必要なすべてのデータベースクエリーがいかにうまくできているかよく分かります。Doctrineはアクティブレコードの上に何を追加しますか - CodeIgniter?

しかし私はDoctrineのようなORMについても読んできました。私がDoctrineのドキュメントを読むと、Active Recordとして使用するのがはっきりしないように見えます。

DoctrineではActive Recordではこれができません。 Doctrineは同じ仕事をより速く、簡単に、より良くしますか?それともActive Recordでできないことをするのですか?

私たちが話していることを示すタスクの例を投稿できる人がいれば最高です。

おかげで、 マシュー

+0

Doctrineは、アクティブなレコードパターンを実装する本格的なORMです。 CodeIgniterのアクティブなレコードクラスは、パターンの「変更された」バージョンに基づいたクエリビルダのものです。 – birderic

+0

こんにちは、 素早くお返事ありがとうございます。これが演奏される例を教えてもらえますか? CRUD操作のようなものについて話していますか? – MatthewSchenker

+0

私は長い答えを書くでしょう。私はDoctrineに関する経験はありませんが、私は両者を比較するために最善を尽くします。 – birderic

答えて

9

Doctrineはアクティブレコードパターンを実装して本格的なORMです。 CodeIgniterのアクティブレコードクラスは、パターンの「変更された」バージョンに基づくクエリービルダー/データベースラッパーです。

免責事項:私はDoctrineを一度も使用していません。私は、私の理解に基づいて、CodeIgniterのアクティブレコードの実装とDoctrineの違いを説明するために最善を尽くしていきます。 CodeIgniterのアクティブレコードクラスを使用して

、あなたはこのようなモデルを実装するかもしれません:

class User_model extends CI_Model 
{ 

    public function get_user_by_username($username) 
    { 
     // Build query using active record methods 
     $this->db->where('username', $username); 
     $this->db->where('active', 1); 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->result(); 
    } 

    // ... 

} 

あなたは基本的にアクティブなレコードのメソッドを使用してクエリを構築しています。各メソッド(where()get()など)が生のSQLにどのようにマップされているかは簡単に分かります。 $this->db->query()ではなくアクティブレコードメソッドを使用する利点は、使用しているデータベースドライバに基づいて各クエリをコンパイルすることです。それ以外にも、CodeIgniterのアクティブなレコードの実装はあまり効果がありません。必要なクエリがあれば作成する必要があります。アクティブなレコードメソッドがクエリービルダーとどのように類似しているかを説明したいと思います。

次のサンプルコードが間違っていることがあります。教義を使用して、あなたはこのようなモデルを持っているかもしれません:

/** @Entity */ 
class User 
{ 

    /** @Column(type="integer") */ 
    private $id; 

    /** @Column(length=50) */ 
    private $username; 

    // ... 

} 

次に、モデルと関連付けられたアクティブなレコード機能を使用するために、あなたはこのような何かをするだろう:

// Instantiate object 
$user = new User(); 

// Set properties 
$user->username = 'some_username'; 

// Save object 
$user->save(); 

// Access properties 
echo $user->id; 

これは単に表面を傷つけていますDoctrineができることの点でプロパティのデフォルト値を設定したり、テーブル間の関係を指定することができます。どのように私はSQLを書くか、またはクエリを構築しなかったことに注目してください。私はオブジェクトのプロパティを設定して保存しました。ドクトリンは残りの世話をする。

Doctrineには独自のクエリービルダーが含まれているので、CodeIgniterのアクティブなレコードなどとは異なります。

Doctrineの使用は、CakePHPまたはRuby on Railsのアクティブレコードパターンの実装と似ています。あなたはそのパターンを見直すことができます。 CodeIgniterのバックグラウンドから来ている場合、CakePHPの例は特に消化しやすいかもしれません。

その他の質問に答えるために、私はDoctrineをCodeIgniterのアクティブなレコードメソッドよりも優れているとは思っていません。より進んだかもしれませんが、他の図書館と同じように、あなたはその仕事に最適なツールを選びたいと思っています。CodeIgniterのアクティブなレコードメソッドに満足しており、高度なORMの必要がない場合は、スキップしてください。

+1

birderic、この返答に親切に感謝します。それは私が後になったものを見るのに役立ちます。私はSymfonyのデータベースクラスも勉強していました。それはCakePHPメソッドによく似ています。私は両方の方法が同じような全体的な目標を達成できることを知ってうれしく思います。 – MatthewSchenker

+0

Doctrine 2.xはアクティブなレコードを使用しません。データマッパーパターンを使用します。 –

18

まず、Doctrineとは何ですか、1,2話ですか?
大きな違いがあります。両者が共通しているのは、両方とも本格的なORM-sであるということだけです。それ以外の場合、実際には2つの間の接続はありません。

教義1 ActiveRecordをに基づいて、教義2は、データマッパーパターンに基づいています。
どちらも同じことができますが、両者には大きな違いがあります。

一般的に言えば、データマッパーは「開発者にはあまり適していませんが、パフォーマンスは向上しています。どうして?実際それはかなり簡単です。アクティブなレコードでは、各エンティティは "周囲"のすべてを知っています。他のエンティティとの関係などです。データマッパでは、エンティティはダムで軽量です。すべてのリレーションマッピングを処理する中央エンティティ(Doctrine2のEntityManager/UnitOfWork)があります。したがって、メモリ使用量とパフォーマンスの面では、データマッパーは高速にする必要があります。
Doctrineの人は、Doctrine2はDoctrine1よりも50%以上速いと言います(設計パターンだけでなく他の違いもあります)。

Doctrine2データマッパーでActiveRecordsを実装することもできます。このblog postを見てください。私は可能な限り小さなコードを保つために開発フェーズのためだけにこのアプローチを使用しています。本番が始まると、追加のActiveRecordsレイヤーを削除し、Doctrine2のデフォルトのデータマッパーにロールバックします。

結論として、両方ですべてを行うことができますが、同じ方法で、生のSQLですべてを行うことができると言えるでしょう。あなたがORM世界の初心者であれば、私はActiveRecordsを使うことをお勧めします。なぜなら、これは単純で(通常は)必要なコードが少ないからです。一方、大規模で複雑なモデルを構築する場合は、データマッパーが優れていると思います。

多分私は何か間違っていますが、これは私がそれを理解した方法です。

CodeIgniters ActiveRecordsとDoctrine(1または2)の比較に関しては、私がCodeIgniterを使用したことがないため、実際には言えません。 Doctrineには、CodeIgnitersのデフォルトのORMよりもはるかに多くの機能があります。たとえば、結果の水和、継承(単一テーブル、クラステーブル)、プリフェッチ、遅延読み込み、余分な遅延読み込み、拡張、振る舞い、最適化、プロキシ、datetime処理...これは大量かつ本格的なORMです。どのような "デフォルトフレームワークORM"の私の経験では、彼らの主な目標はできるだけシンプルなので、初心者は非常に簡単にそれを取得することができます。 Doctrineは強力な獣であり、確かに、組み込みのCodeIgniter ORMよりも効率的かつ/または論理的に正しい方法で多くのことを行うことができます。欠点は、学習とコード作成に時間がかかり、数千ものファイルを持つ巨大な図書館なので、すべてを稼働させるだけで、軽量の代替品に比べてオーバーヘッドがかかります。

+0

ZolaKt、あなたの答えに感謝します。私はすべての最新バージョンについて話しています。私はあなたがDoctrineのために説明した追加機能が好きです。一般的に、私はCodeIgniterが本当に好きですが、私は一般的なフレームワークには新しいです。私の最善のアプローチは、CodeIgniterのActive Recordクラスを習得し、後でCodeIgniter内でDoctrineを使用する方法です。 – MatthewSchenker

+0

これは純粋に主観的ですが、フレームワークを学ぶ予定の場合は、Kohanaをご覧ください。これはCodeIgniter以外のライブラリを統合したことにより、デザインによって少し柔軟になっています。最新のバージョンは問題ありませんが、私が言ったように、これは2つの異なるパターンで2つの全く異なるプロジェクトです。デフォルトのアクティブなレコードORMを持つ "より小さい"プロジェクトスティックを実行している場合。 Doctrine canのほとんどすべてを行うことができますが、手作業で行う必要があります。私が指摘したことの1つは、ORMが継承をサポートすることは非常にまれであるため、Doctrineのように、必要な場合はそれを行うことができるものを見つけてください。 – ZolaKt

+0

もう1つのアドバイス。使用するかどうかを決める前に、読んで試してみてください。 CodeIgniters ORMに自分自身を限定しないでください。いくつかの良いPHPアクティブレコードORMがあります。そのパターンについてのすべて。あなたがアクティブなレコードORMを知っていれば、すぐに相手を知ることができます。データマッパーにも同じことが起こります。たとえば、Doctrineを知っているなら、(N)Hibernateを知ることができます。データマッパーでアクティブなレコードを好む場合は、Propelをチェックアウトすることもできます。アクティブなレコードに基づく本格的なORM。 Doctrineの唯一のPHPの代替手段を見てきたことから、すべての "派手な"機能が必要な場合 – ZolaKt

関連する問題