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の必要がない場合は、スキップしてください。
Doctrineは、アクティブなレコードパターンを実装する本格的なORMです。 CodeIgniterのアクティブなレコードクラスは、パターンの「変更された」バージョンに基づいたクエリビルダのものです。 – birderic
こんにちは、 素早くお返事ありがとうございます。これが演奏される例を教えてもらえますか? CRUD操作のようなものについて話していますか? – MatthewSchenker
私は長い答えを書くでしょう。私はDoctrineに関する経験はありませんが、私は両者を比較するために最善を尽くします。 – birderic