Symfony2ワークショップ Doctrine2 MongoDB-ODM
Symfony2ワークショップ
Doctrine2(MongoDB-ODM)
日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)
Symfony2ワークショップ Doctrine2 MongoDB-ODM
注意 2分Symfony2は使いません
Doctrine2はSymfony2の中でも役割が大きいので
このワークショップでは独立して学習します
MongoDB(ODM)でやりますが、MySQL(ORM)でも同じコンセプトなので応用できます
(といっても、MongoDBの概念はRDBとはだいぶ違う)
★最後にSymfony2から使う方法があります
Symfony2ワークショップ Doctrine2 MongoDB-ODM
● 参考ドキュメントURLhttp://www.mongodb.org/display/DOCSJP/Homehttp://docs.symfony-reloaded.org/master/http://www.doctrine-project.org/projects/mongodb_odm
Symfony2ワークショップ Doctrine2 MongoDB-ODM
MongoDB準備(5分)● $ mongo
> help> show dbs> use test> show collections> db.User.help()> db.User.find()
● pecl install mongo
● http://localhost:28017/ ←Webインターフェイス /etc/mongodb.conf rest=true を追加
動く方は、helpなどを見てください
Symfony2ワークショップ Doctrine2 MongoDB-ODM
Doctrine2 MongoDB ODM(1分)● 概要ODM = Object Document Mapper
ORM的にMongoDBのドキュメント(レコード)を操作Doctrine2 ORMとかなり統一性があるDQLっぽいもので検索できる
★もともとORMを使っていた開発者には、馴染みやすいスタイルと思われる
Symfony2にも統合されている
Symfony2ワークショップ Doctrine2 MongoDB-ODM
mongodb-odm(5分)● Doctrine2のうち、MongoDBを扱うライブラリ
$ mkdir wsroot ←ワークショップ作業ルート(任意)$ cd wsroot$ git clone git://github.com/doctrine/ mongodb-odm.git$ cd mongodb-odm$ git submodule init$ git submodule update$ cd ..$ mkdir d2ws ←作業ファイル用(任意)
● Git環境がない場合は今回用のパッケージをコピー
Symfony2ワークショップ Doctrine2 MongoDB-ODM
01 ブートストラップ(5分)● d2ws/01/01.php
Symfony2ワークショップ Doctrine2 MongoDB-ODM
01 名前空間を使う (2分)
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 (再)ドキュメントとは(1分)● MongoDBに保存する1つのデータ構造(レコード)
ドキュメントの集まり = コレクション※コレクションがRDBのテーブルに相当する
● Doctrine2では、POPO(Plain Old PHP Object)のクラスのメンバ変数(など)にアノテーションで設定を記述する(この設定を「マッピング」と呼ぶ)
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 ドキュメントの作成(5分)● 02/Document/User.php
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 ドキュメントの追加 (3分)● d2ws/bootstrap.php(をコピーしてください)
● d2ws/02/02.php
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 保存されたか確認(1分)● $ mongo> use test> db.User.find()
● http://localhost:28017/test/User/
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 取得 (1) (2分)d2ws/02/02-find1.php ドキュメントマネージャーからfind
findの戻り値はMongoCursorオブジェクトforeachで回すと、マッピング先のオブジェクト(Document\User)で取得できる
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 取得(2) (2分)● d2ws/02/02-find2.php Queryオブジェクトを使う →Query Builder API
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 取得(3) (-分) ● d2ws/02/02-find3.php DQL DQLを使ってCRUD。まだExperimentalらしい
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 ハイドレート (2分)● Queryオブジェクトのhydrate()メソッドのパラメータでON/OFF指定 true = ON false = OFF
->hydrate(false) にすると、foreachで回した時にマッピングが行われていない素のMongoレコードが返される(配列)
★カーソルオブジェクトはそのままという点も注意
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 hydrate off (1分)● d2ws/02/02-find2-non-hydrate.php
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 更新(1) persist→flush● 最初にデータを追加したのとほぼ同じ。
● 複数のpersistを1回のflushにまとめられる。
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 更新(2) modifier● modifierを使うと処理効率が良い & ATOMIC
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 更新(3) modifier(multiple)● multipleオプションを使いたい場合は、execute()のオプションで指定する。
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 削除(1) remove→flush ● DocumentManager経由
Symfony2ワークショップ Doctrine2 MongoDB-ODM
02 削除(その他)● QueryBuilder / DQL経由もupdateと同様
Symfony2ワークショップ Doctrine2 MongoDB-ODM
03 Embedding(組み込み) (10分)● まあやってみましょう
● d2ws/03/ -03.php -Document/ -User.php -Address.php
UserにAddressをEmbedします
Symfony2ワークショップ Doctrine2 MongoDB-ODM
03 Embedding マッピング● d2ws/03/Document/Person.php にEmbed追加
Symfony2ワークショップ Doctrine2 MongoDB-ODM
03 Embedding 保存● d2ws/03/03.php
Symfony2ワークショップ Doctrine2 MongoDB-ODM
03 Embedding 取得● d2ws/03/03-retrieve.php
Symfony2ワークショップ Doctrine2 MongoDB-ODM
04 Reference(参照) (10分)● Embeddingと似ているReferenceはMongoDB上で実体が別になる※一度に検索できない
● d2ws/04/ -04.php -Document/ -User.php -Address.php
Userに記述する構文はEmbedとほとんど一緒
Symfony2ワークショップ Doctrine2 MongoDB-ODM
04 Reference マッピング● Embeddingと似ている
アノテーションで、明示的にカスケードを指定する必要がある(Embeddingの場合は、デフォルトでカスケードされる)
Symfony2ワークショップ Doctrine2 MongoDB-ODM
04 Reference 保存● 保存されたデータを確認
Rederenceの部分は、別コレクションのoidが保存される
Symfony2ワークショップ Doctrine2 MongoDB-ODM
04 Reference 取得● 取得処理も同様(検索可能フィールドに注意)
Symfony2ワークショップ Doctrine2 MongoDB-ODM
まだまだありますが・・・● 次回にご期待くださいw
● Symfony2で使うには・・・・
・app/AppKernel.php でバンドル有効化・app/config/config.phpでエクステンション設定→「doctrine_odm.mongodb: ~」・ドキュメントマネージャーはコンテナ経由「$this['doctrine.odm.mongodb.document_manager']」
→アノテーションがちょっとだけ違う「@mongodb:Document」など
Top Related