symfony1.2のDoctrineを使ってみた
symfony1.2から標準でサポートされるようになったORマッパ、Doctrineを使ってみました。今回使ったsymfonyのバージョンは1.2.2です。
Doctrineを有効にする
初期状態ではPropelが有効になっているので、Doctrineを使うように設定します。
// config/ProjectConfiguration.class.php
public function setup()
{
// for compatibility / remove and enable only the plugins you want
//$this->enableAllPluginsExcept(array('sfDoctrinePlugin', 'sfCompat10Plugin'));
$this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
}
これでDoctrineが有効になりました。有効になっていれば、以下のコマンドでDoctrineのコマンド一覧が出るはずです。
$ ./symfony list doctrine
databases.ymlの設定
databases.ymlも初期設定ではPropelの設定になっているので、Doctrineの設定に変更します。
# config/databases.yml
dev:
doctrine:
param:
classname: DebugPDO
test:
doctrine:
param:
classname: DebugPDO
all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=dbname'
username: username
password: password
encoding: utf8
schema.ymlからテーブルをつくる
今回はbookmarkを登録するアプリケーションを想定してつくってみます。テーブルはbookmarkとuserのふたつです。
config/doctrineというディレクトリをつくってそこにschema.ymlをおきます。
# [config/doctrine/schema.yml]
Bookmark:
tableName: bookmark
columns:
id:
type: integer(4)
primary: true
autoincrement: true
user_id: integer(4)
url: string(255)
relations:
User:
local: user_id
foreign: id
type: one
User:
tableName: user
columns:
id:
type: integer(4)
primary: true
autoincrement: true
username: string(255)
password: string(255)
このschema.ymlからテーブルをつくります。
$ ./symfony doctrine:build-db #database.ymlで設定したデータベースを作成
$ ./symfony doctrine:build-model #schema.ymlからモデル作成
$ ./symfony doctrine:build-sql #モデルからSQL作成
$ ./symfony doctrine:insert-sql #SQL実行
これで以下のテーブルができます。
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(255) default NULL,
`password` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `bookmark` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL,
`url` varchar(255) default NULL,
PRIMARY KEY (`id`),
KEY `user_id_idx` (`user_id`),
CONSTRAINT `bookmark_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
fixtureでsampleデータを入れる
下記のymlを用意します。
# data/fixtures/user.yml
User:
User_1:
username: foo
password: bar
User_2:
username: hoge
password: fuga
[data/fixtures/bookmark.yml]
Bookmark:
Bookmark_1:
User: User_1
url: http://foo.com/
Bookmark_2:
User: User_1
url: http://bar.com/
Bookmark_3:
User: User_2
url: http://baz.com/
下記コマンドでデータを取り込みます
$ ./symfony doctrine:data-load
コマンドラインからDQLを使う
DoctrineはDQL(Doctrine Query Language)というSQLに似た独自言語を使ってDBにアクセスできます。
$ ./symfony doctrine:dql "from User"
>> doctrine executing dql query
DQL: from User
found 2 results
-
id: '1'
username: foo
password: bar
-
id: '2'
username: hoge
password: fuga
こんな感じ。ちょっとしたデータを参照したいときには便利かも。
使ってみる
では準備ができたところで実際にsymfonyの中で使ってみます。
全データ取得
$q = Doctrine_Query::create()
->select('u.*')
->from('User u');
$users = $q->fetchArray();
print_r($users);
[出力]
Array
(
[0] => Array
(
[id] => 1
[username] => foo
[password] => bar
)
[1] => Array
(
[id] => 2
[username] => hoge
[password] => fuga
)
)
whereで検索
$q = Doctrine_Query::create()
->from('User u')
->where('u.username = ?', 'foo');
$users = $q->fetchArray();
print_r($users);
[出力]
Array
(
[0] => Array
(
[id] => 1
[username] => foo
[password] => bar
)
)
一件だけ取得
$q = Doctrine_Query::create()
->from('User u')
->where('u.username = ?', 'foo');
$user = $q->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
print_r($user);
[出力]
Array
(
[id] => 1
[username] => foo
[password] => bar
)
もう少し詳しい使い方まで書く予定だったんですけど、意外と長くなった(というかちょっと疲れた)ので今日はここまで。
- Prev Entry:簡単にsymfonyをインストールするスクリプト
- Next Entry:ちょっと便利なvimのTips