正規化されたスキーマではテーブル結合は付きもの。
mysql が5以降であれば、VIEW を CREATE し ethna コマンドで add-app-object。
ただし、mysqlが4もしくは3の為 VIEW を作れない環境の場合アプリケーション側で結合。
例えば注文明細一覧取得のようなシチュエーションならこうする。
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 ); }