PHPDAO プロジェクト Wiki

PHPDAOってなに?

  • PHP で RDB に簡単にアクセスできるようにするクラス群です。

PHPDAOで何ができるの?

  • RDB Table から簡単にデータを持ってこれるよ。
  • SQL いらないよ。(概念を知ってたほうがいいけど)
  • 関連付けされた定義ファイルから、自動的にRelationを作るよ

使い方のサンプル

  1. 下のようなスキーマの user, memo というテーブルがあるとしたら
    mysql> desc user;
    +-----------+---------------------+------+-----+---------+----------------+
    | Field     | Type                | Null | Key | Default | Extra          |
    +-----------+---------------------+------+-----+---------+----------------+
    | usn       | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
    | loginname | varchar(64)         | YES  |     | NULL    |                |
    | nickname  | varchar(128)        | YES  |     | NULL    |                |
    | passwd    | varchar(64)         | YES  |     | NULL    |                |
    | regdate   | varchar(19)         | YES  |     | NULL    |                |
    +-----------+---------------------+------+-----+---------+----------------+
    
    mysql> desc memo;
    +---------+---------------------+------+-----+---------+----------------+
    | Field   | Type                | Null | Key | Default | Extra          |
    +---------+---------------------+------+-----+---------+----------------+
    | srl     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
    | usn     | bigint(20) unsigned | YES  |     | NULL    |                |
    | url     | varchar(512)        | YES  |     | NULL    |                |
    | comment | text                | YES  |     | NULL    |                |
    +---------+---------------------+------+-----+---------+----------------+
    
  2. user テーブルから usn が1のレコードを取得
      $user = phpdao_factory::create_table_class('user');
      $user->where(array('usn'=>1))->fetch();
      echo $user->usn;
      echo $user->loginname;
      echo $user->nickname;
      ....
    
  3. user テーブルから loginname が 'test' のレコードを取得
      $user = phpdao_factory::create_table_class('user');
      $user->where(array('loginname'=>'test'))->fetch();
      echo $user->usn;
      ....
    
  4. user テーブルから、usn が 1 のレコードを取得して、そのレコードに関連付けされたmemoテーブルのレコードを取得する
      $user = phpdao_factory::create_table_class('user');
      $user->where(array('usn'=>1))->fetch();
      echo $user->usn;
      ....
      $memo = $user->get_link('memo');
      echo $memo->srl;
      echo $memo->url;
      echo $memo->comment;
      ....
    
  5. 逆もまたOK
      $memo = phpdao_factory::create_table_class('memo');
      $memo->where(array('srl'=>1))->fetch();
      echo $memo->srl;
      ....
      $user = $memo->get_link('user');
      echo $user->usn;
      ....
    

準備

  1. ココから最新(0.1)のtarball を落としてください。 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/tags/0.1-release/?root=phpdao
  2. 落としたら解凍
    kasuya@proc:~/tmp/phpdao$ tar -xzvf 0.1-release.tar.gz
    0.1-release/
    0.1-release/README
    0.1-release/TODO
    0.1-release/bin/
    0.1-release/bin/generate.php
    0.1-release/bin/tags.sh
    0.1-release/bin/test.sh
    0.1-release/src/
    0.1-release/src/cfg.php
    0.1-release/src/db.php
    0.1-release/src/factory.php
    0.1-release/src/phpdao.php
    0.1-release/src/cfg/
    0.1-release/src/cfg/phpdao.ini
    0.1-release/src/cfg/relation.ini
    0.1-release/src/dao/
    0.1-release/src/dao/base.php
    0.1-release/test/
    0.1-release/test/cfg.php
    0.1-release/test/db.php
    0.1-release/test/factory.php
    0.1-release/test/table.php
    0.1-release/test/cfg/
    0.1-release/test/cfg/phpdao.ini
    0.1-release/test/cfg/relation.ini
    0.1-release/test/sql/
    0.1-release/test/sql/db.sql
    kasuya@proc:~/tmp/phpdao$
    
  3. Database の作成
    kasuya@proc:~/tmp/phpdao/0.1-release$ mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 625
    Server version: 5.0.32-Debian_7etch1-log Debian etch distribution
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> create database phpdaotest;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> exit
    Bye
    kasuya@proc:~/tmp/phpdao/0.1-release$
    
  4. Table 作成 & テストデータの流し込み(userテーブル、memoテーブルのデータはなくなります)
    kasuya@proc:~/tmp/phpdao/0.1-release/test/sql$ mysql phpdaotest < db.sql
    kasuya@proc:~/tmp/phpdao/0.1-release/test/sql$
    
  5. DB に接続するための情報(phpdao.ini)を修整
    kasuya@proc:~/tmp/phpdao$ cd 0.1-release/src/cfg/
    kasuya@proc:~/tmp/phpdao/0.1-release/src/cfg$ vi phpdao.ini
    
    db.type = mysql        # DB type (今はmysqlのみです)
    db.host = localhost    # 接続先
    db.dbname = phpdaotest # 接続先 DB 名
    db.user = kasuya       # 接続ユーザー名
    db.pass =
    
  6. relation.ini(テーブル間のリレーションを記述) の編集
    kasuya@proc:~/tmp/phpdao/0.1-release/src/cfg$ vi relation.ini
    
    # relation tables
    user.usn=memo.usn  # user テーブルの usn と memo テーブルの usn のリレーションを張る
    
  7. DB スキーマを読み込んで、schema.php の作成(
    kasuya@proc:~/tmp/phpdao/0.1-release/src/cfg$ cd ../../bin/
    kasuya@proc:~/tmp/phpdao/0.1-release/bin$ php generate.php
    kasuya@proc:~/tmp/phpdao/0.1-release/bin$ ls -al ../src/dao/
    合計 16
    drwxr-xr-x 2 kasuya kasuya 4096 2007-10-11 18:36 .
    drwxr-xr-x 4 kasuya kasuya 4096 2007-10-11 18:33 ..
    -rw-r--r-- 1 kasuya kasuya 3800 2007-10-10 23:43 base.php
    -rw-r--r-- 1 kasuya kasuya 3029 2007-10-11 18:37 schema.php # ←コレができているか確認!
    kasuya@proc:~/tmp/phpdao/0.1-release/bin$
    
  8. 内容はこんな感じになっています。
    <?php
    # このクラスはphpdao_factory::generate()を使って作成されています。
    # 変更が必要な場合は、DBのスキーマを変更後、php ./bin/generate.php を行ってください
    class phpdao_dao_schema
    {
      public static $schema = array (
          'memo'=>array( //{{{
            '@primary_key'=>'srl',
                'srl' => array(
                  'field'    => 'srl',
                  'type'     => 'bigint',
                  'len'      => '20',
                  'null'     => '',
                  'default'  => '',
                  'extra'    => 'auto_increment',
    
                 ),
                'usn' => array(
                  'field'    => 'usn',
    	    ............
    
    
  9. 問題なく作成されていたら、テストプログラムの作成
    kasuya@proc:~/tmp/phpdao/0.1-release/bin$ cd ../../
    kasuya@proc:~/tmp/phpdao$ ls -al
    合計 24
    drwxr-xr-x 3 kasuya kasuya 4096 2007-10-11 18:44 .
    drwxr-xr-x 7 kasuya kasuya 4096 2007-10-11 18:32 ..
    drwxr-xr-x 5 kasuya kasuya 4096 2007-10-11 18:32 0.1-release
    -rw-r--r-- 1 kasuya kasuya 9114 2007-10-11 01:02 0.1-release.tar.gz
    kasuya@proc:~/tmp/phpdao$ vi phpdaotest.php
    
    <?php
    require_once '0.1-release/src/phpdao.php';
    
    $user = phpdao_factory::create_table_class('user');
    $user->where(array('usn'=>1))->fetch();
    print_r($user);
    
  10. 実行
    kasuya@proc:~/tmp/phpdao$ php phpdaotest.php
    phpdao_user Object
    (
        [__table_name:protected] => user
        [__where:protected] => Array
            (
                [usn] => 1
            )
    
        [__attached:protected] => 1
        [usn] => 1
        [loginname] => loginname1
        [nickname] => nickname1
        [passwd] => pwd1
        [regdate] => 2000-01-01 00:00:00
    )
    kasuya@proc:~/tmp/phpdao$
    

弱点

  • JOIN 使えないから複数 row で get_link() するとその数だけQuery走るよね?むちゃくちゃ遅いよね?
  • はい。JOIN 使えるようにします。><

対応しているDB

  • mysql
  • 他無いです。そのうち対応予定

TODO

  1. JOIN を使えるようにする
  2. PostgreSQL の対応
  3. generate.php のときに table class を出力(?)
  4. __autoload() を使って table class の読み込み