| 4 | | ++ インストレーション |
| 5 | | Doctrineの導入はとても簡単です。http://doctrine.pengus.net/svn/trunk から最新のDoctrineのリビジョンを入手するだけです。 |
| 6 | | |
| 7 | | DoctrineをダウンロードするためにSVN (Subversion)クライアントが必要です。 |
| 8 | | |
| 9 | | 現在のディレクトリでDoctrineをチェックアウトするために**svn**コマンドラインは次のコードを使用します: |
| 10 | | |
| 11 | | <code type="bash"> |
| 12 | | svn co http://doctrine.pengus.net/svn/trunk . |
| 13 | | </code> |
| 14 | | |
| 15 | | SVNクライアントがない場合、下記のリストから一つ選んで下さい。**チェックアウト**、**パス**、**リポジトリURL**オプションを見つけて http://doctrine.pengus.net/svn/trunk を入力して下さい。Doctrineをチェックアウトするためにユーザー名もしくはパスワードは必要ありません。 |
| 16 | | |
| 17 | | * [http://tortoisesvn.tigris.org/ TortoiseSVN]はWindows Explorerに統合されるWindowsアプリケーションです |
| 18 | | * [http://www.apple.com/downloads/macosx/development_tools/svnx.html svnx]はMac OS X GUI svnアプリケーションです |
| 19 | | * Eclipseは[http://subclipse.tigris.org/ subeclipse]プラグインを通してSVNと統合します |
| 20 | | |
| 21 | | ++ 新しいプロジェクトを始める |
| 22 | | Doctrine_RecordはすべてのDoctrineベースプロジェクトの基本コンポーネントです。少なくともそれぞれのデータベーステーブルに対してDoctrine_Recordが一つあります。Doctrine_Record follows the [http://www.martinfowler.com/eaaCatalog/activeRecord.html Active Record pattern] |
| 23 | | |
| 24 | | Doctrineは常に主キーを持たないテーブルに対して'id'という名前の主キーを追加します。データベースのテーブルを作成するために必要な唯一のことはDoctrine_Recordを拡張するクラスを定義しhasColumn()メソッドコールを持ちこれらのクラスをエクスポートすることでsetTableDefinitionメソッドを設定することです。 |
| 25 | | |
| 26 | | 'user'というデータベーステーブルを作成することを考えてみます。カラムはid(primary key)、name、username、passwordとcreatedです。Doctrineが既にインストールされているとして必要なものは下記の数行です: |
| 27 | | |
| 28 | | User.php : |
| 29 | | <code type="php"> |
| 30 | | class User extends Doctrine_Record |
| 31 | | { |
| 32 | | public function setTableDefinition() |
| 33 | | { |
| 34 | | // 'user'テーブルカラムを設定する |
| 35 | | // idカラムはオートインクリメントで主キーは指定されていないことに注意 |
| 36 | | |
| 37 | | $this->hasColumn('name', 'string',30); |
| 38 | | $this->hasColumn('username', 'string',20); |
| 39 | | $this->hasColumn('password', 'string',16); |
| 40 | | $this->hasColumn('created', 'integer',11); |
| 41 | | } |
| 42 | | } |
| 43 | | </code> |
| 44 | | |
| 45 | | ユーザークラスをデータベースにエクスポートするために次のシンプルなビルドスクリプトが必要です: |
| 46 | | |
| 47 | | <code type="php"> |
| 48 | | //ベースのDoctrineクラスをrequireする |
| 49 | | require_once('lib/Doctrine.php'); |
| 50 | | |
| 51 | | //autoloaderを登録する |
| 52 | | spl_autoload_register(array('Doctrine', 'autoload')); |
| 53 | | |
| 54 | | require_once('User.php'); |
| 55 | | |
| 56 | | //接続をセットアップする |
| 57 | | Doctrine_Manager::connection('mysql://user:pass@localhost/test'); |
| 58 | | |
| 59 | | //クラスをエクスポートする |
| 60 | | Doctrine::createTablesFromArray(array('User')); |
| 61 | | </code> |
| 62 | | これで基本的なCRUOオペレーションをサポートするユーザーモデルができました! |
| 63 | | |
| 64 | | |
| 65 | | ++ 既存のデータベースと連携する |
| 66 | | +++ 導入 |
| 67 | | |
| 68 | | DoctrineのようなORMツールを探すときに共通の事例はデータベースとコードが肥大/複雑になることです。SQLコードを操作するためによりしっかりしたツールが必要とされます。 |
| 69 | | |
| 70 | | Doctrineは既存のデータベースからDoctrine_Recordクラスの生成をサポートします。ドメインモデルに対してすべてのDoctrine_Recordクラスを手動で書く必要はありません。 |
| 71 | | |
| 72 | | +++ 最初のインポートを作成する |
| 73 | | |
| 74 | | 'file'という名前の一つのテーブルを持つtestというMySQLのデータベースを考えてみましょう。 |
| 75 | | |
| 76 | | fileテーブルは次のSQL命令文で作成されました: |
| 77 | | |
| 78 | | <code type="sql"> |
| 79 | | CREATE TABLE file ( |
| 80 | | id INT UNSIGNED AUTO_INCREMENT NOT NULL, |
| 81 | | name VARCHAR(150), |
| 82 | | size BIGINT, |
| 83 | | modified BIGINT, |
| 84 | | type VARCHAR(10), |
| 85 | | content TEXT, |
| 86 | | path TEXT, |
| 87 | | PRIMARY KEY(id)) |
| 88 | | </code> |
| 89 | | |
| 90 | | これをDoctrine_Recordクラスに変換することを考えます。これは次のコードスニペットで簡単に達成できます: |
| 91 | | |
| 92 | | <code type="php"> |
| 93 | | require_once('lib/Doctrine.php'); |
| 94 | | |
| 95 | | spl_autoload_register(array('Doctrine', 'autoload')); |
| 96 | | Doctrine_Manager::connection('mysql://root:dc34@localhost/test'); |
| 97 | | |
| 98 | | // インポートメソッドは一つのパラメータを取ります: importディレクトリ |
| 99 | | // (生成されたレコードファイルが設置されるディレクトリ) |
| 100 | | Doctrine::generateModelsFromDb('myrecords'); |
| 101 | | </code> |
| 102 | | |
| 103 | | お終いです!myrecordsディレクトリでFile.phpという名前のファイルが存在します。ファイルは次の通りです: |
| 104 | | |
| 105 | | <code type="php"> |
| 106 | | /** |
| 107 | | * This class has been auto-generated by the Doctrine ORM Framework |
| 108 | | * Created: Saturday 10th of February 2007 01:03:15 PM |
| 109 | | */ |
| 110 | | class File extends Doctrine_Record |
| 111 | | { |
| 112 | | public function setTableDefinition() |
| 113 | | { |
| 114 | | $this->hasColumn('id', 'integer', 4, array('notnull' => true, |
| 115 | | 'primary' => true, |
| 116 | | 'unsigned' => true, |
| 117 | | 'autoincrement' => true)); |
| 118 | | $this->hasColumn('name', 'string', 150); |
| 119 | | $this->hasColumn('size', 'integer', 8); |
| 120 | | $this->hasColumn('modified', 'integer', 8); |
| 121 | | $this->hasColumn('type', 'string', 10); |
| 122 | | $this->hasColumn('content', 'string', null); |
| 123 | | $this->hasColumn('path', 'string', null); |
| 124 | | } |
| 125 | | public function setUp() |
| 126 | | { |
| 127 | | |
| 128 | | } |
| 129 | | } |
| 130 | | </code> |
| 131 | | |
| 132 | | +++ インポートオプション |
| 133 | | |
| 134 | | |
| 135 | | ++ クラスをエクスポートする |
| 136 | | +++ 導入 |
| 137 | | |
| 138 | | Doctrineはレコードクラスをデータベースにエクスポートすることをサポートします。レコード定義に与えられた定義に基づいてDoctrineはデータベーススキーマを変更します。 |
| 139 | | |
| 140 | | 次の定義を持つUserとPhonenumberという名前のクラスを考えます: |
| 141 | | |
| 142 | | <code type="php"> |
| 143 | | // User.phpファイル |
| 144 | | class User extends Doctrine_Record |
| 145 | | { |
| 146 | | public function setTableDefinition() |
| 147 | | { |
| 148 | | $this->hasColumn('name', 'string', 20); |
| 149 | | } |
| 150 | | public function setUp() |
| 151 | | { |
| 152 | | $this->hasMany('Phonenumber', array('local' => 'id', |
| 153 | | 'foreign' => 'user_id')); |
| 154 | | } |
| 155 | | } |
| 156 | | // Phonenumber.phpファイル |
| 157 | | class Phonenumber extends Doctrine_Record |
| 158 | | { |
| 159 | | public function setTableDefinition() |
| 160 | | { |
| 161 | | $this->hasColumn('phonenumber', 'string', 20); |
| 162 | | $this->hasColumn('user_id', 'integer'); |
| 163 | | } |
| 164 | | public function setUp() |
| 165 | | { |
| 166 | | $this->hasOne('User', array('local' => 'user_id', |
| 167 | | 'foreign' => 'id', |
| 168 | | 'onDelete' => 'CASCADE')); |
| 169 | | } |
| 170 | | } |
| 171 | | </code> |
| 172 | | |
| 173 | | これらのクラスは'models/'ディレクトリにあります。このディレクトリをイテレートしてこれらのクラスを以下のスクリプトを持ったデータベース構造に追加します: |
| 174 | | |
| 175 | | <code type="php"> |
| 176 | | |
| 177 | | require_once('path-to-doctrine/lib/Doctrine.php'); |
| 178 | | |
| 179 | | spl_autoload_register(array('Doctrine', 'autoload')); |
| 180 | | |
| 181 | | //エクスポートするためにデータベース接続が必要である |
| 182 | | Doctrine_Manager::connection('mysql://user:pass@localhost/test'); |
| 183 | | |
| 184 | | Doctrine::createTablesFromModels('models'); |
| 185 | | </code> |
| 186 | | |
| 187 | | これはMySQL上で次のクエリーを実行します。 |
| 188 | | |
| 189 | | <code type="sql"> |
| 190 | | CREATE TABLE user (id BIGINT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id), INDEX(id)); |
| 191 | | CREATE TABLE phonenumber (id INT AUTO_INCREMENT, phonenumber VARCHAR(20), user_id BIGINT, PRIMARY KEY(id), INDEX(user_id)); |
| 192 | | ALTER TABLE phonenumber ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE; |
| 193 | | </code> |
| 194 | | |
| 195 | | 次のことに注意を払います: |
| 196 | | |
| 197 | | # 主キーカラムを指定していないのでオートインクリメントの主キーが自動追加されます |
| 198 | | # Doctrineはインデックスを参照された関連カラムに自動追加します(これはMySQLに必要です) |
| 199 | | |
| 200 | | +++ エクスポートクエリーを手に入れる |
| 201 | | |
| 202 | | エクスポートクエリーをすぐに実行を行いたくなくむしろクエリーの文字列を入手してそれらをbuild.sqlファイルに添付したい状況があるとします。これは次のように達成できます: |
| 203 | | |
| 204 | | <code type="php"> |
| 205 | | require_once('path-to-doctrine/lib/Doctrine.php'); |
| 206 | | |
| 207 | | spl_autoload_register(array('Doctrine', 'autoload')); |
| 208 | | |
| 209 | | Doctrine_Manager::connection('mgsql://user:pass@localhost/test'); |
| 210 | | |
| 211 | | $queries = Doctrine::generateSqlFromModels('models'); |
| 212 | | |
| 213 | | echo $queries; |
| 214 | | </code> |
| 215 | | |
| 216 | | 同じ状況を考えてエクスポートを実行するために必要なSQLクエリーの文字を取得したいことを考えます。Doctrine::generateSqlFromModels()で実現されました。 |
| 217 | | |
| 218 | | +++ エクスポートオプション |
| 219 | | |
| 220 | | <code type="php"> |
| 221 | | // テーブル定義と制約などのすべてをエクスポートする |
| 222 | | $manager = Doctrine_Manager::getInstance(); |
| 223 | | |
| 224 | | $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL); |
| 225 | | |
| 226 | | // 制約無しでクラスをエクスポートする |
| 227 | | |
| 228 | | $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_TABLES ^ |
| 229 | | Doctrine::EXPORT_CONSTRAINTS); |
| 230 | | |
| 231 | | // エクスポーティングをオフにする |
| 232 | | |
| 233 | | $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_NONE); |
| 234 | | |
| 235 | | $sql = Doctrine::generateSqlFromModels(); |
| 236 | | </code> |
| | 4 | ++ Installation |
| | 5 | ++ Starting new project |
| | 6 | ++ Working with existing databases |
| | 7 | ++ Creating tables |
| | 8 | ++ Generating models |
| | 9 | ++ Auto loading models |
| | 10 | ++ Command line interface |
| | 11 | ++ My first project tutorial |