NakajiJapan

餓鬼の超弩級日記


Doctrineを利用して実際の処理をしてみるの

Doctrineいれてみる with zendからの続きです。

では実際にDoctrineで生成されたクラスを利用して
データベースの操作を行ってみましょう。

ユーザデータ一覧取得

            // user
             $query = Doctrine_Query::create()
                     ->from('User u')
                     ->orderBy('u.id')
                           ;
            $lists = $query->execute();

ユーザデータ作成

            // user
            $user = new User();
            $user->username = "username"
            $user->password = "password"
            $user->save();

ユーザデータ削除

            //$user = new User();
            $query = Doctrine_Query::create()
                                    ->delete("User u")
                                    ->whereIn("id", $prms["delid"]);
            $delcnt = $query->execute();

ユーザデータ変更

            // user
            $user = Doctrine::getTable('User')->find(1);

            $user->username = "modified_username"
            $user->password = "modified_password"
            $user->save();

ちょっと応用してみます。
情報取得時にテーブルをJOINして取得します。

            // user and group
            $query = Doctrine_Query::create()
                     ->from('User u')
                     ->leftJoin('u.Group g')
                     ->orderBy('u.id')
                           ;
            $lists = $query->execute();
            $this->view->lists = $lists;

上記処理は、Doctrine独自の書き方でDoctrine側であらかじめ関連づけしといてカラムと繋ぎ合せて
自動でSQLを作成しています。なのでSQLのなかで勝手に「UserGroup」テーブルがジョインされています。

しかし、この状態だと「UserGroup」テーブルの情報を取りたいとき取得されないみたいだったので
以下にようにして普通に結合させます。

            // user and group
            $query = Doctrine_Query::create()
                     ->from('User u')
                     ->leftJoin('u.UserGroup ug')
                     ->leftJoin('ug.Group g')
                     ->orderBy('u.id')
                           ;
            $lists = $query->execute();
            $this->view->lists = $lists;
No Comments »

Doctrineいれてみる with zend

doctrineを入れてみる。

久々にPHPでORMらしいツールがでましたね。
Hibernateをインスパイアされたものらしいので結構使えそうかも
って思ってインストールしてみました。

ちなみに今は、ZendFrameworkを使っていたのでそこに組み込んでみることにする。

Doctrine is an object relational mapper (ORM) for PHP 5.2.3+ that sits on top of a powerful database abstraction layer (DBAL). One of its key features is the option to write database queries in a proprietary object oriented SQL dialect called Doctrine Query Language (DQL), inspired by Hibernates HQL. This provides developers with a powerful alternative to SQL that maintains flexibility without requiring unnecessary code duplication.

まずはダウンロード。

http://www.doctrine-project.org/download

ディレクトリ配置は
application/data
application/data/sql
application/data/ficture
application/migrations
application/schema
application/scripts

ライブラリ関連は「lib」ディレクトリ以下に配置。
library/doctrine/Docrine.php
library/doctrine/Docrine

配置が完了したらindex.phpにdoctrineの設定を記述します。

/-----------------------------------------------------------
// setting Doctrine
//-----------------------------------------------------------
/*
 * Set super-global data
 */
Doctrine_Manager::connection("mysql://user:pass@192.168.0.10/dbname");

/*
 * Configure Doctrine
 */
Zend_Registry::set('doctrine_config', array(
        'data_fixtures_path'    =>  APPLICATION_PATH . '/doctrine/data/fixtures',
        'models_path'                  =>  APPLICATION_PATH . '/models',
        'migrations_path'          =>  APPLICATION_PATH . '/doctrine/migrations',
        'sql_path'                        =>  APPLICATION_PATH . '/doctrine/data/sql',
        'yaml_schema_path'        =>  APPLICATION_PATH . '/doctrine/schema'
        ));

本当はBootstrapにプラグインとして組み込めばいいんですけど、本筋じゃないのでここでは割愛。
もっといってみると、この場合負荷の分散になっていなからごねごねしなきゃいけない。

次はスキーマを作成します。
このスキーマを通してSQLを作成したり、モデルクラスを作成するためのファイルです。

とりあえず、こんな感じで作ってみます。
ファイル名は「schema.yaml」です。

User:
  columns:
    username: string(256)
    password: string(256)
  relations:
    Groups:
      class: Group
      refClass: UserGroup
      foreignAlias: Users

Phonenumber:
  columns:
    user_id: integer
    phonenumber: string(26)
  relations:
    User:
      foreignAlias: Phonenumbers
      onDelete: CASCADE

Group:
  tableName: groups
  columns:
     name: string(256)

UserGroup:
  columns:
    user_id:
      type: integer
      primary: true
    group_id:
      type: integer
      primary: true
  relations:
    User:
      foreignAlias: UserGroups
      onDelete: CASCADE
    Group:
      foreignAlias: UserGroups
      onDelete: CASCADE

※作ってみたのはいいけどテーブル大きくなってきたら大変だなーって思ってたら
カレントディレクトリ内のファイルはおいてあれば見に行く仕様になっていたので
一安心でした。

そこからdoctrineコマンドを通してモデルクラス、並びにSQLを作成してDBに設定を反映させてみます。
この一連の作業がコマンド3発で来てしまうのがうれしいものですね。

# ./doctrine-cli.php generate-models-yaml
generate-models-yaml - Generated models successfully from YAML schema
# ./doctrine-cli.php generate-sql
generate-sql - Generated SQL successfully for models
# ./doctrine-cli.php create-tables
create-tables -

これからはコントローラーで処理してみます。

1 Comment »

Doctrine調査

No Comments »