[PX通信]LiveRecord

xFramework2.5.0あたりで顔出したLiveRecordクラスをxFrameworkPX3.0.1でアルファ版としてちゃんと出します(ぉぃ

概要

LiveRecordクラスは、PDO経由でデータベースを操作するPHPのO/Rマッピングクラスです。

PDOに対するアクセスは、内部的にDatabaseManagerを使用します。なので、正式にはPDO+ネイティブコネクションの、つまりPDO限定ではないO/Rマッピングクラスです。

まだDatabaseManagerがネイティブをサポートしていないので、それにあわせてLiveRecordも順次対応される感じです。

使用方法

LiveRecordの使用方法は、大きく分けて2つに分かれます。

  • ナマでインスタンス化して使う
  • テーブルごとに継承して使う

ナマでインスタンス化して使う

LiveRecordはxFrameworkModuleクラスを継承した他のライブラリクラスと同様の動作をします。なので、内部でアクションクラスと同様の記述が可能です。

さて、ではナマでインスタンス化してみます。

$objLR = new LiveRecord( $this );

終わり(笑)

普通に、第一引数に、アクションクラスオブジェクトを指定してインスタンス化します。その際、第二引数、第三引数の指定をすることで、テーブル名、データベースコネクション名を設定することができます。

テーブル名を指定してインスタンス化してみる

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );

第二引数に、参照するテーブル名を指定します。文字列で指定してくださいね。じゃないと例外発生するようにしてあります。

テーブル名とデータベースコネクションを指定してインスタンス化してみる

さらに、使用するデータベースコネクションを指定指定インスタンス化してみます。ここでいっているコネクション名というのは、database.xmlに記述されているコネクション名です。

$objLR = new LiveRecord( $this, ‘tbl_liverecord’, ‘default’ );

では、一番最初の、テーブル名、データベースコネクションが未指定の場合は、どうなっているのか?

テーブル名

指定されていません。nullです。null。

なので、あとでsetTableNameメソッドを使用して指定する必要があります。

$objLR = new LiveRecord( $this );
$objLR->setTableName( ‘tbl_liverecord’ );

何らかの操作をするときに、テーブル名が未指定だと、例外が発生します。

データベースコネクション

データベースコネクションもテーブル名と同様にメソッドで指定します。

setDBConnNameで設定してください。テーブル名と違うのは、未指定時にDatabaseManagerのデフォルトで動作するという点があります。DetabaseManagerのコネクション取得は、コネクション名が設定されていない場合は、database.xmlの一番最初に指定されたコネクションを使用するという仕様になっていますので、それに従います。

$objLR = new LiveRecord( $this );
$objLR->setTableName( ‘tbl_liverecord’ );
$objLR->setDBConnName( ‘default’ );

テーブルごとに継承して使う

テーブルごとに継承して使う場合は、もちろんLiveRecordクラスを継承して使うのですが、クラスの命名規則があります。

先のようにtbl_liverecordクラスへアクセスクラスを作成する場合は、

class tbl_liverecord_LiveRecord extends LiveRecord {

}

というように、最後に_LiveRecordという名前をつけてください。

では、上記クラスを使用して、同様にインスタンスを生成してみます。

$objTblLR = new tbl_liverecord_LiveRecord( $this );

インスタンスをが取得できたので、次からデータ操作を行っていきます。

getメソッド単純な取得 (Select) リクエストを行う

単純な1レコードを取得するための操作を行います。LiveRecordクラスには、プロパティとしてstrPKNameというプロパティがあり、初期値で’id’という文字列が設定されています。getメソッドの引数に、単に一つだけパラメータを指定した場合、下記のSQLが実行されます。

$objLR = new LiveRecord( $this );
$objLR->setTableName( ‘tbl_liverecord’ );
$objResult = $objLR->get( 1 );

プライマリキーフィールド名を設定する場合は、setPKNameを使用して変更します。

$objLR->setPKName( ‘seq’ );

実行されるSQL

SELECT * FROM tbl_liverecord WHERE id = 1

上記のコードでは、$objResultに結果が格納されます。しかし、LiveRecordでは、アクセサを介して値を取得する方法が用意されています。

アクセサを使用して値を取得する

$objLR = new LiveRecord( $this );
$objLR->setTableName( ‘tbl_liverecord’ );
$objLR->get( 1 );

echo $objLR->id;

取得後、プロパティとしてアクセスすることで、値を取得することが可能です。また、単行取得のメソッドなので、条件が複数になる場合でも最初の一件目だけを取得し取得することになります。

おまけ

LiveRecordを継承したクラスを使用した場合は、

$objTblLR = new tbl_liverecord_LiveRecord( $this );
$objTblLR->get( 1 );

echo $objTblLR->id;

になります。

結果を検索する

説明あと

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );

$objLR->id = 1;
$objLR->email = ‘kotsutsumi@xenophy.com’;

// 結果を検索する(配列で取得する)
$objRows = $objLR->find();

foreach( $objRows as $arrRow ) {

    echo ‘<ul>’;
    echo ‘  <li>’ . $arrRow[ ‘id’ ] . ‘</li>’;
    echo ‘  <li>’ . $arrRow[ ‘name’ ]. ‘</li>’;
    echo ‘  <li>’ . $arrRow[ ‘email’ ] . ‘</li>’;
    echo ‘</ul>’;
}

説明あと

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );

$objLR->id = 1;
$objLR->email = ‘kotsutsumi@xenophy.com’;

$objLR->find();

// fetchメソッドで取得
while( $objLR->fetch() ) {

    echo ‘<ul>’;
    echo ‘  <li>’ . $objLR->id . ‘</li>’;
    echo ‘  <li>’ . $objLR->name . ‘</li>’;
    echo ‘  <li>’ . $objLR->email . ‘</li>’;
    echo ‘</ul>’;
}

説明あと

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );

$objLR->addWhere( ‘id = 1’ );
$objLR->addWhere( ‘id = 3’, ‘OR’ );
$objLR->find();

// fetchメソッドで取得
while( $objLR->fetch() ) {

    echo ‘<ul>’;
    echo ‘  <li>’ . $objLR->id . ‘</li>’;
    echo ‘  <li>’ . $objLR->name . ‘</li>’;
    echo ‘  <li>’ . $objLR->email . ‘</li>’;
    echo ‘</ul>’;
}

カウントを取得する

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );
$objLR->addWhere( ‘id > 1’ );
echo $objLR->count();

DISTINCTを指定する

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );
$objLR->addWhere( ‘id > 2’ );
echo $objLR->count( ‘DISTINCT name’ );

フィールドを指定する

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );
echo $objLR->count( ‘email’ );

SQLに埋め込む値をエスケープする

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );
$strName = “ほげ”;
$objLR->addWhere( ‘name = \” . $objLR->escape( $strName ) . ‘\” );
echo $objLR->count();

インサートする

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );
$objLR->name = ‘テスト太郎’;
$objLR->email = ‘example@xenophy.com’;

$objLR->insert();

更新をする

$objLR = new LiveRecord( $this, ‘tbl_liverecord’ );
$objLR->get( 1 );
$objLR->name = ‘こつつみん’;
$objLR->update();

 

[PX通信]LiveRecord