« フレームワーク | メイン | ethnaのビューとテンプレート »

ethna

ethna で mysql のテーブル JOIN

正規化されたスキーマではテーブル結合は付きもの。
mysql が5以降であれば、VIEW を CREATE し ethna コマンドで add-app-object。
ただし、mysqlが4もしくは3の為 VIEW を作れない環境の場合アプリケーション側で結合。
例えば注文明細一覧取得のようなシチュエーションならこうする。
CREATE TABLE orders( # 注文テーブル
 ocd     INT PRIMARY KEY AUTO_INCREMENT # 注文CD
,opcd    INT # 商品マスタ参照番号
,onumber INT # 注文個数
);
CREATE TABLE product( # 商品マスタ
 pcd     INT PRIMARY KEY AUTO_INCREMENT
,pname   VARCHAR(10) # 商品名
,pprice  INT # 商品価格
);
結合するテーブルで全列名を一意にする。
class APPID_Orders extends Ethna_AppObject{
        :
    function _SQLPlugin_SearchTable(){
        return "LEFT JOIN product ON opcd=pcd";
    }    
    function _SQLPlugin_SearchPropDef(){
        $appObject =& new APPID_Pproduct( $this->backend );
        return $company->getDef();
    }
}
上記のようにオーバーライドする。
AppObjectのsearchProp()やAppManagerのgetObjectPropList()でWHERE句かORDER句で結合相手の列名を少なくとも1つ含めると上記が実行されFROM句とSELECT句が追加される。
例えば、ViewClass や ActionClass などで使う時。
    $manager =& $this->backend->getManager( 'orders' );
    $resultArrey = $manager->getObjectPropList( 'orders'
    ,    $keys    //    SELECT句→    必要な列名の配列
    ,    $filter  //    WHERE句 →    列名=>Ethna_AppSearchObjectの連想配列
    ,    $order   //    ORDER句 →    列名=>OBJECT_SORT_ASCなどの連想配列
    ,    $offset  //    OFFSET句
    ,    $count   //    LIMIT句
    );
私の場合、ページングなどの様々な集合検索メソッドを全てAppManagerに追加。
class APPID_OrdersManager extends Ethna_AppManager{
    getPage( $offset, $count ){
        $keys = array('ocd','pname','pprice','onumber');
        $filter['ocd'] =& new Ethna_AppSearchObject( $ocd, OBJECT_CONDITION_GE );
        $order['pname'] = OBJECT_SORT_ASC;
        return $this->getObjectPropList( 'offer'
        ,    $keys
        ,    $filter
        ,    $order
        ,    $offset
        ,    $count
        );
}

トラックバック

このエントリーのトラックバックURL:
https://www.remix.asia/cgi/mt/mt-tb.cgi/6501

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)