0

ここに状況があります.... ... DBInterface に DBInterface を実装する DBManager があり、4 つのメソッドを取得しました。

-create(DBCmd);
-read(DBCmd);
-update(DBCmd);
-delete(DBCmd);

DBCmd オブジェクトは SQL ステートメントの生成を担当し、DBCmd には SQL ステートメント内のオブジェクトが必要です。

class DBCmd{
    public _constructor($aObj){
    }
    public executeCreate(){
    }
    public executeRead(){
    }
    public executeUpdate(){
    }
    public executeDelete(){
    }

}

流れは次のようになります。

aObject ---> put it into DBCmd ----> put the DBCmd in DBManager ---> execute 

しかし、他のテーブルに関連するいくつかのオブジェクトを取得すると、問題が発生します。たとえば、顧客には購入レコードがあり、どの購入レコードには多くのアイテムがあります...

では、read メソッドで何をすればよいのでしょうか。顧客に関連するすべての記録を読む必要がありますか?? 購入レコード内のすべてのアイテムもループする必要がありますか? はいの場合、顧客を読み取るときに3つのテーブルをクエリする必要がありますが、表示する必要のないテーブルもある....それはリソースを無駄にします...

そして、別の解決策を思いつきました。DBCmd の新しいセットを作成して、関連する DB 項目を取得できるようにします。たとえば、次のようになります。

class getReleatedPurchaseRecordDBCmd{
    public _constructor($aCustomerObject){
    }
    //.... ....
}

しかし、この「解決策」では、いくつかの問題がありました。顧客オブジェクトとの関係を失うことです...はい、すべてのレコードを読み戻すことができ、顧客オブジェクトを取得できます基本的に購入レコードについて何も知りません。 ...

次のようなことを私に依頼する人もいるかもしれません:

class customer{
    //skip other methods...

    public getPurchaseRecords(){
       //query the db
    }

}

それは機能しますが、オブジェクト構造にdbの間に強い関係を持たせたくありません....そのため、DBCmdのものを考え出しました...

では、すべてが非常にカップリングしているように見えますが、どうすれば解決できますか? ありがとうございました。

4

1 に答える 1

0

このようなものについては、通常はSQL COUNTとJOINを含む最初のクエリでサブオブジェクトの数を取得する傾向があり、後で必要に応じて呼び出すことができる別のgetSubObjectsコマンドがあります。たとえば、次のようになります。

$datamodel->getCustomer($id);//or some such method

戻り値

class Customer{
   $id = 4;
   $recordCount = 5;
   $records = null;
}

その後、必要に応じて表示用のカウントを使用できます。レコードが必要な場合は、次のように呼び出します。

$customer->records = $datamodel->getCustomerRecords($customer->id);
于 2011-07-29T03:54:52.980 に答える