Webtech Walker

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
)

もう少し詳しい使い方まで書く予定だったんですけど、意外と長くなった(というかちょっと疲れた)ので今日はここまで。

このエントリーをはてなブックマークに追加