doctrine2 odm-workshop-1

31
Symfony2ワークショップ Doctrine2 MongoDB-ODM Symfony2 ワークショップ Doctrine2 (MongoDB-ODM) 日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto

Upload: hidenori-goto

Post on 19-May-2015

2.870 views

Category:

Technology


0 download

DESCRIPTION

日本Symfonyユーザー会 第1回Symfony2勉強会 MongoDB ODMワークショップ基礎編

TRANSCRIPT

Page 1: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

Symfony2ワークショップ

Doctrine2(MongoDB-ODM)

日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)

Page 2: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

注意 2分Symfony2は使いません

Doctrine2はSymfony2の中でも役割が大きいので

このワークショップでは独立して学習します

MongoDB(ODM)でやりますが、MySQL(ORM)でも同じコンセプトなので応用できます

(といっても、MongoDBの概念はRDBとはだいぶ違う)

★最後にSymfony2から使う方法があります

Page 3: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

 ● 参考ドキュメントURLhttp://www.mongodb.org/display/DOCSJP/Homehttp://docs.symfony-reloaded.org/master/http://www.doctrine-project.org/projects/mongodb_odm

Page 4: Doctrine2 odm-workshop-1

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などを見てください

Page 5: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

Doctrine2 MongoDB ODM(1分)● 概要ODM = Object Document Mapper

ORM的にMongoDBのドキュメント(レコード)を操作Doctrine2 ORMとかなり統一性があるDQLっぽいもので検索できる

★もともとORMを使っていた開発者には、馴染みやすいスタイルと思われる

Symfony2にも統合されている

 

Page 6: Doctrine2 odm-workshop-1

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環境がない場合は今回用のパッケージをコピー

Page 7: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

01 ブートストラップ(5分)● d2ws/01/01.php

Page 8: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

01 名前空間を使う (2分)

Page 9: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 (再)ドキュメントとは(1分)● MongoDBに保存する1つのデータ構造(レコード)

ドキュメントの集まり = コレクション※コレクションがRDBのテーブルに相当する

● Doctrine2では、POPO(Plain Old PHP Object)のクラスのメンバ変数(など)にアノテーションで設定を記述する(この設定を「マッピング」と呼ぶ)

Page 10: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 ドキュメントの作成(5分)● 02/Document/User.php

Page 11: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 ドキュメントの追加 (3分)● d2ws/bootstrap.php(をコピーしてください)

● d2ws/02/02.php

Page 12: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 保存されたか確認(1分)● $ mongo> use test> db.User.find()

● http://localhost:28017/test/User/

Page 13: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 取得 (1) (2分)d2ws/02/02-find1.php ドキュメントマネージャーからfind

findの戻り値はMongoCursorオブジェクトforeachで回すと、マッピング先のオブジェクト(Document\User)で取得できる

Page 14: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 取得(2) (2分)● d2ws/02/02-find2.php Queryオブジェクトを使う →Query Builder API

Page 15: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 取得(3) (-分) ● d2ws/02/02-find3.php DQL DQLを使ってCRUD。まだExperimentalらしい

Page 16: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 ハイドレート (2分)● Queryオブジェクトのhydrate()メソッドのパラメータでON/OFF指定 true = ON false = OFF

->hydrate(false) にすると、foreachで回した時にマッピングが行われていない素のMongoレコードが返される(配列)

★カーソルオブジェクトはそのままという点も注意

Page 17: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 hydrate off (1分)● d2ws/02/02-find2-non-hydrate.php

Page 18: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 更新(1) persist→flush● 最初にデータを追加したのとほぼ同じ。

● 複数のpersistを1回のflushにまとめられる。

Page 19: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 更新(2) modifier● modifierを使うと処理効率が良い & ATOMIC

Page 20: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 更新(3) modifier(multiple)● multipleオプションを使いたい場合は、execute()のオプションで指定する。

Page 21: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 削除(1) remove→flush  ● DocumentManager経由

Page 22: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

02 削除(その他)● QueryBuilder / DQL経由もupdateと同様

Page 23: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

03 Embedding(組み込み) (10分)● まあやってみましょう

● d2ws/03/ -03.php -Document/ -User.php -Address.php

UserにAddressをEmbedします

Page 24: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

03 Embedding マッピング● d2ws/03/Document/Person.php にEmbed追加

Page 25: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

03 Embedding 保存● d2ws/03/03.php

Page 26: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

03 Embedding 取得● d2ws/03/03-retrieve.php

Page 27: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

04 Reference(参照) (10分)● Embeddingと似ているReferenceはMongoDB上で実体が別になる※一度に検索できない

● d2ws/04/ -04.php -Document/ -User.php -Address.php

Userに記述する構文はEmbedとほとんど一緒

Page 28: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

04 Reference マッピング● Embeddingと似ている

アノテーションで、明示的にカスケードを指定する必要がある(Embeddingの場合は、デフォルトでカスケードされる)

Page 29: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

04 Reference 保存● 保存されたデータを確認

Rederenceの部分は、別コレクションのoidが保存される

Page 30: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

04 Reference 取得● 取得処理も同様(検索可能フィールドに注意)

Page 31: Doctrine2 odm-workshop-1

Symfony2ワークショップ Doctrine2 MongoDB-ODM

まだまだありますが・・・● 次回にご期待くださいw

● Symfony2で使うには・・・・

・app/AppKernel.php でバンドル有効化・app/config/config.phpでエクステンション設定→「doctrine_odm.mongodb: ~」・ドキュメントマネージャーはコンテナ経由「$this['doctrine.odm.mongodb.document_manager']」

→アノテーションがちょっとだけ違う「@mongodb:Document」など