symfony & Doctrine
symfonyでプログラミングを始める場合、今までSQLを記述してきた人にとってはPropelが障害になることが多いようです。
今回はsymfonyで使用可能なO/Rマッパ Doctrineを紹介したいと思います。
symfonyで採用されているデフォルトのO/Rマッパ PropelはSQLをほとんど書かずにオブジェクト操作でDBにアクセスする設計になっています。このオブジェクト操作でDBにアクセスする方法は、慣れれば別にそれほど悪くないと思います。
でも、普段SQLに慣れている人にとっては、SQLを考える、それに対応するクライテリアを考える、実装、というようにSQLからクライテリアが必要になってしまいます。そのため、直感的な操作が中々難しくなるかもしれません。
そこで、今回紹介するDoctrineの登場です。DoctrineはよりSQLに近い、DQLというものを使用してDBを操作します。
ちなみにDoctrineはHibernateにインスパイアされて作成されています。PropelがApache TorqueのPHP版なので、Javaを普段から使用している人にとっては自分の好みでどちらを使用したいかがはっきりするのではないでしょうか。
それでは、Doctrineの使用方法です。まず用意するのは、PHP5.2以上、symfonyのプロジェクトとSubversionです。インストール方法は、symfonyのプラグインsfDoctrinePluginを参照してください。
なお、2007年10月時点でDoctrineは1.0.0 RC1となっており、正式リリースが近くなってきました。そのため、仕様の変更もそれほどないと思います。symfonyのプラグインについても、活発に開発されているので、svn updateしながら最新版を使いつづけていきましょう。
sfDoctrinePluginをインストールするとsymfonyのコマンドにdoctrine-xxxxというpropel-xxxxと同じようなコマンドが追加されるので、propelと同様にモデルを作成します。なお、Propelで作成したアプリケーションをいきなりDoctrineに変更するのはかなり大変だと思うので、新しいアプリケーションで試した方がよいと思います。
- propel:
sample: id: name: varchar(255)
上記のschema.ymlに対応するデータベースがある場合は、symfony doctrine-build-schemaでDoctrine用のスキーマを作成することができます。
Propelと比較すると以下のようになります。
- //
新規作成 - //
Propel - $sample
= new Sample; - $sample->setName('hoge');
- $sample->save();
- //
Doctrine - $sample
= new Sample; - $sample->set('name',
'hoge'); - $sample->save();
- //
プライマリーキーからの検索 - //
Propel - $sample
= SamplePeer::retrieveByPk($id); - //
Doctrine - $sample
= Doctrine::getTable('Sample')->find($id); - //
普通の検索 - //
Propel - $c
= new Criteria - $c->add(SamplePeer::NAME,
'hoge', Criteria::EQUAL); - $sample_list
= SamplePeer::doSelect($c); - //
Doctrine - $sample_list
= Doctrine_Query::create()->from('Sample s') ->where('s.name = ?', 'hoge')->execute();
Criteriaを使用するかしないかで、普通の検索は随分と異なります。where addWhereメソッドを繰り返すことで、ANDの条件を追加することもできますし、whereメソッド内でANDやORも使用することができるので、SQLとあまり変わらない感覚で実行することができます。このDQLについては、解説ページを見るとかなり詳しく書いてあります。(修正: where メソッドではなく複数のWHERE句をつなげる場合は addWhereメソッドを使用します。)
Propelでできる大抵のこと(CRUDやADMIN、ページャーなどなど)はDoctrineでもできるので、Propelに困っている人はDoctrineを使用してみてください。
※なお、以前のhttp://svn.symfony-project.com/plugins/sfDoctrinePlugin/branches/0.1を使用していた人は、注意してバージョンアップしてください。スキーマファイルをsymfony doctrine-convert-schemaで再作成し、モデルの再構築を行います。それ以外にも、sfDoctrineクラスが廃止されているので、Doctrineクラスに変更する必要があったり、Warningが発生することもあります。
コメント
コメントフォーム
トラックバックURI
-
- [symfony] doctrineでmysqlのソケットエラー from symfonyはじめました
- なかなか時間がなくて試せなかったsymfony1.2系を試してみました。 どう...
2009年01月11日 21:49
最近の記事
JavaScriptのクロスドメイン問題対応方法 [2012年05月17日 : 笹亀弘]
JavaScriptのコーディング規約を気軽にチェック [2012年05月14日 : 中川善樹]
誕生日プレゼント [2012年05月10日 : 阿部恵]
イラストでわかる!git入門の入門 [2012年05月09日 : 志田仁美]
【CSS3】HSL色空間による色指定のすゝめ [2012年05月09日 : 橋本章史]
インスピレーションをかきたてるポスターデザインのまとめ記事のまとめ [2012年04月25日 : 鴨田健次]
エンジニアの英会話 〜とっさの一言〜 [2012年04月19日 : 斉藤勝也]
イコライザーをFireworksで描いてみました [2012年04月16日 : 和田記光]
SFNewTech Japan Night のファイナリストに選出されました!(他、もろもろの出展の御案内) [2012年04月06日 : 小林有佳]
使えるとちょっと便利なSSHのTIPS [2012年04月04日 : 牧野克俊]













Doctrineを使用した場合に、symfonyの他の部分でうまく動かなくなったりすることはありますか?
(たとえばアドミンジェネレータなど)
もう一つ、
アシアルさんで執筆されたsymfony本はv1.0には対応していますか?
# 私のところだけかもしれませんが、FireFoxだとcapcha keyが表示されません。IEでは大丈夫でした。
Doctrine 自体がsymfony本体ほどは安定していないので、うまく動かなくなることもあります。最近はかなり安定してはいると思います。
> アシアルさんで執筆されたsymfony本はv1.0には対応していますか?
対応しています。ひょっとすると v1.1 のことを考えているのかもしれませんが、v1.1 には対応していません。
# capcha の指摘ありがとうございます。調べてみます。