CBL ActiveRecord

Copyright© 2005-2006 サイボウズ・ラボ株式会社
2006年3月23日
畑 慎也

  1. 序文
  2. CBL ActiveRecord はPHP5.x向けのO/Rマッピング・ライブラリです。 Active Record とは、 データベースのテーブルやビューの列をラップし、データベースアクセスをカプセル化し、 ドメインロジックを追加するオブジェクトです。 本ライブラリを使用することにより、データベースへのアクセスが容易に行えます。

  3. ライセンス
  4. GNU Library or Lesser General Public License (LGPL2.1以上)

  5. ダウンロード
  6. CBL ActiveRecord の最新版は 31tools.com のサイトから利用できます。

  7. 必要条件
  8. PHP5.x CBL ActiveRecord はPHP5.1上で開発およびテストされています。
    PDO PDO (PHP Database Objects) - PECL形式で配布されている、 PHP5用のネイティブのデータベース抽象レイヤーです。 PHP5.1から正式に組み込まれています。

  9. 使用方法
  10. 命名規則

    CBL_ActiveRecord クラスから派生するクラスの名前はデータベース内のテーブル名と対応します。 例えば、テーブル名が 'user' の場合、クラス名は 'User' とする必要があります。

    データベースへの接続

    $pdo = new PDO( 'mysql:dbname=todo;host=localhost', 'root', '' );
    CBL_ActiveRecord::setDefaultPDO( $pdo );
    

    クラス定義

    require_once 'cbl_activerecord.php';
    
    class User extends CBL_ActiveRecord
    {
    }
    
    class ToDo extends CBL_ActiveRecord
    {
    }
    

    レコードの挿入

    id を指定しない場合:
    $todo = new ToDo();
    $todo->name = 'Planning';   // set property
    $todo->save();              // or $todo->insert();
    
    id を指定する場合:
    $todo = new ToDo();
    $todo->id = 1;              // set id
    $todo->name = 'Planning';   // set property
    $todo->insert();
    
    文字列型の id を指定する場合:
    $todo = new ToDo();
    $todo->id = '57f3d093'      // set id
    $todo->name = 'Planning';   // set property
    $todo->insert();
    
    文字列型のユニークな id を生成する場合:
    $todo = new ToDo();
    $todo->uniqid();            // create and set id (default id length is 8 characters)
    $todo->name = 'Planning';   // set property
    $todo->insert();
    
    16バイトのユニークな id を生成する場合:
    $todo = new ToDo();
    $todo->uniqid(16);          // create and set id (max id length is 32 characters)
    $todo->name = 'Planning';   // set property
    $todo->insert();
    
    ユニークなIDを生成するだけの場合:
    $todo = new ToDo();
    $id = $todo->uniqid(8, FALSE);
    

    レコードの取得

    find() メソッドを使用する場合:
    $todo = new ToDo();
    $todo = $todo->find( $id );  // get record by id
    
    コンストラクタを使用する場合:
    try {
        $todo = new ToDo( $id );    // get record by id
    } catch ( Exception $e ) {
        echo $e->getMessage();      // throw exception, if not found.
    }
    
    取得するカラムを指定する場合:
    $todo = new Todo();
    $todo = $todo->find( $id, array( 'columns'=>'id, name' ) );
    

    レコードの更新

    SQLでUPDATEを実行する前にSELECTを実行させる場合:
    $todo = new ToDo( $id );    // get record by id
    $todo->name = 'Scheduling'; // modify property
    $todo->save();              // or $todo->update();
    
    SQLでSELECTを実行させない場合:
    $todo = new ToDo();
    $todo->id = $id;            // set record id directly
    $todo->name = 'Scheduling'; // modify property
    $todo->save();              // or $todo->udpate();
    
    複数のレコードを同時に更新する場合:
    $todo = new ToDo();
    $id_list = array(1, 2, 5);  // prepare id list
    $todo->finish = 1;          // modify property
    $todo->update($id_list);    // update() with $id_list parameter
    

    レコードの削除

    SQLでDELETEを実行する前にSELECTを実行させる場合:
    $todo = new Todo( $id );    // get record by id
    $todo->delete();
    
    SQLでSELECTを実行させない場合:
    $todo = new ToDo();
    $todo->delete( $id );
    

    レコード一覧の取得

    全レコードを取得する場合:
    $todo = new ToDo();
    $todo_list = $todo->find_all();
    foreach( $todo_list as $id=>$todo_item )
    {
        echo $todo_item->name;
    }
    
    特定の条件で検索する場合:
    $user_id = intval( $user_id);
    $todo = new ToDo();
    $todo_list = $todo->find_all( array( 'conditions'=>"user_id={$user_id}" ) );
    
    ソートする場合(order):
    $todo = new ToDo();
    $todo_list = $todo->find_all( array( 'order'=>'name' ) );
    
    取得するレコード数を限定する場合(limit):
    $todo = new ToDo();
    $todo_list = $todo->find_all( array( 'limit'=>20 ) );
    
    レコード取得開始位置を指定する場合(offset):
    $todo = new ToDo();
    $todo_list = $todo->find_all( array( 'offset'=>5, 'limit'=>20 ) );
    
    取得するカラムを指定する場合:
    $todo = new ToDo();
    $todo_list = $todo->find_all( array( 'columns'='id, name' ) );
    

    レコードの数の取得

    全レコード数の場合:
    $todo = new ToDo();
    echo $todo->count();
    
    ある条件下のレコード数の場合:
    $todo = new ToDo();
    echo $todo->count(array('conditions'=>'finish=1'));
    

    リレーション

    関連するレコードを1つ取得する場合:
    $user = new User( $user_id );       // get user record
    $todo = $user->todo->find( $id );   // get todo of todo.user_id={$user_id}
    
    関連するレコードの一覧を取得する場合:
    $user = new User( $user_id );           // get user record
    $todo_list = $user->todo->find_all();   // get todo list of todo.user_id={$user_id}
    
    INNOR JOIN を実行する場合(SELECT todo.*, user.name FROM todo INNER JOIN user ON todo.user_id=user.id):
    $todo = new ToDo();
    $todo_list = $todo->find_all(
        array('columns'=>'todo.*, user.name'),
        array('table'=>'user', 'lhs'=>'user_id', 'rhs'=>'id'));
    

    ルートオブジェクト(CBL_ActiveRoot)の利用

    $root = new CBL_ActiveRoot();
    $todo = $root->todo->find( $id );
    $todo_list = $root->todo->find_all( $id );
    

Copyright © サイボウズ・ラボ株式会社