NakajiJapan

餓鬼の超弩級日記


Doctrine の仕様的なもの。(V1.2)

カラムのタイプで文字列の型を指定するとき、256以上にするとTEXT型になってしまう。

Account:
  columns:
    username:
      type: string(256)

とりあえず限界が255でそれ以降はなぜかTEXT型でした。
なんか設定の意図でもあるのかな====。。
どう見えてもバグのような気がする。

だって普通にvarchar(1024)てやりたい場合で絶対できくるはずなのに。

ちょっと使えないDoctrine_Cli

追記:(2月15日)
・CLIコマンドは主キーを「id」にしないとうまいこと機能しない。(ハックすればいいんだけどね!!)
・カラム制限がいろいろある。(ハックすればいいんだけどね!!)

No Comments »

Doctrineでパーティショニングするときのための技術調査その1

パーティショニングしながらDoctrineてつかえるのだろうかとふと思いしらべてみたらあった。
ちょっちバージョンは古いけど

ここからの引用

Please add ability not to create foreign key to database before releasing the last LTS version of Doctrine.

Creating foreign key is usually good, but there are some situations that we should not use foreign key.

1) In MySQL, partitioning doesn’t support foreign key. Partitioning is a good practice for very large tables. If you want to get information about it, visit: http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html
2) As the case may be, foreign keys in database will rule out doing application-level-cascading-delete.
3) MySQL outputs warnings when it tries creating foreign keys to some storage engines (e.g. MyISAM). We have to decrease warnings.

I have a patch that includes unit test. My changes are adding Doctrine::ATTR_CREATE_FOREIGN_KEY, and not to create foreign key to database when a value of Doctrine::ATTR_CREATE_FOREIGN_KEY is false. It will work on MySQL, PostgreSQL and Oracle.

Mysqlだとパーティショニングするときは外部キーを作成できない。
だから、Doctrineではそれに代替する機能としてアプリケーションレベルのカスケーディングデリート がある。

だからそれ使ってよってことか。

その下が重要で各ストレージエンジンで外部キーを作成しようとするとMySQLはワーニングを出力されてしまう。

でもまだエラー出ちゃうから減らしますよーっていってるのか。
α版の時点でパッチも出てるから対処はされてるみたいだね。

yamlからSQLにできるのかなー。

あ、パーティション関係のSQLは別ファイルで置いておいておけばいいか。

■参考URL
15.5. パーティショニングの制約と制限
Doctrine Project

No Comments »

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 »