Doctrineいれてみる with zend

( Doctrine )

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 - 

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