2009-08-08 17 views
3

基本的なレベルでOOPのパラダイムが得られると思いますが、データベースのレコードを検索する適切な方法を概念化するのは難しいです。私は本当に私は私が考えるようOOPが同じくらい得ることはありませんので、これはそれがオブジェクトのための良い候補をたくさん持っているので、私は書くしようとしているアプリケーションは、ショッピングカートです...オブジェクトのコレクションを操作するにはどうすればよいですか?あるいは、オブジェクトは類似のオブジェクトのコレクションを取得しますか?

である疑いがあります。私が扱うオブジェクトは製品です(はい、これは非常に原始的です)。

<?php 
    class Product 
    { 
     public $id = 0; 
     public $name = ''; 
     public $price = 0; 

     function __construct($id) 
     { 
      // if $id exists try to retrieve 
      // a product with $id 
      // else create a new product 
      // and set $this->id 
     } 
    } 

    $product = new Product(); 
    echo $product->name; 
?> 

十分に簡単です。しかし、今では(検索結果ページの)複数の商品を検索したいと思っています。

私の傾斜は、いくつかの入力を取り、単に製品IDのリストを返すSQLクエリを実行し、別のクラスを記述することです。私はそれらの結果をループし、それぞれの製品オブジェクトを作成します。その後、オブジェクトの配列をループして、検索結果ページを構築することができます。

私は理由は分かりませんが、これはちょうど正しい方法のように感じられません。あまりにも多くの仕事のように思えるのは、まず製品IDの一覧を取得するためのクエリを実行してから、各製品のデータを取得するためにさらにクエリを実行するからです。私が必要とするすべてのデータを返すクエリを1回だけ実行すると、処理時間が大幅に短縮されます。

どうすればいいですか?おそらく他の何か?

答えて

2

は(信じがたいが、製品データベースなしで存在することができ;)データベースを認識していない製品クラスを書く)とデータベースの結果から、製品のオブジェクトを作成できるクラス。

+1

「データベースを認識していません」というのは、オブジェクトにデータを設定しないでください。 – barophobia

+0

少なくとも、コンストラクタ内のデータベース自体を照会するのではありません。おそらく、「レコード」のデータソースからオブジェクトの配列(または別のコレクション)を作成する静的メソッドがあります。イテレータ。 pdoの結果はイテレータとして使用できます。このメソッドは、それがデータベースクエリの結果であることを知る必要はありません。 – VolkerK

0

は、私はあなたが右の行に考えていると思います - 一つのことしかし、なぜマッチする製品の配列(またはリスト)を返し、IDのみを返します。

クエリメソッドを持つProductFinderについて、パラメータは製品の定義で、戻り値の型は製品のコレクションです。

それからなどの製品を削除、ProductFinderも(DBへの挿入)の製品を作成するための責任を取ることができることを見ることができる従って、製品自体は、ほとんど、あるいはデシベルについて何を知っています。 ProductFinderは、ProductKeeperやProductHomeなどのわずかに異なる名前を取得することがあります。

あなたが製品に加えて、かなりの数のエンティティを持っている場合は、その後、彼らの「キーパー」はやがてあなたが永続化フレームワークで終わる、共通のコードの非常に多くを持っていることがあります。 PHPのためのleast one alreadyにあるようです、私はあなたがそれを見てお勧めします。

+0

製品のデータを編集し、必要なdbコールを行う責任は誰にありますか? ProductKeeperまたはProduct? – barophobia

+0

ProductKeeper(または永続性フレームワーク)。したがって、異なるデータベース、または他の永続化メカニズムの場合、異なるKeepersを持つことができます。 – djna

2

データベースからオブジェクト指向アプリケーションへのマッピングは簡単ではありません。これにはさまざまな方法がありますが、単純な戦略は、エンティティクラス(Product)とゲートウェイクラス(別のものだが、通常はProductGatewayまたはProductFinder)を持つことです。ゲートウェイクラスはデータベースにアクセスでき、エンティティのフェッチと初期化方法を知っています。同じクラスは、オブジェクトをデータベースにマップする方法も知っています。例えば

class ProductGateway { 
    function getProductById($id) { 
    $result = $this->db->query("select * from products where id = ?", $id); 
    return new Product($result->next()); 
    } 
    function save($product) { 
    if ($product->getId()) { 
     return $this->update($product); 
    } else { 
     return $this->insert($product); 
    } 
    } 
    ... 
} 

ポイントは、製品がデータベースから来たかではない場合、アプリケーションレベルのコードを知っている必要がないということです。これは単にエンティティオブジェクトを変更し、永続性を処理するためにゲートウェイのために残します。

0

OOPのデータベースを扱うための既存のフレームワークの使用を嫌うことはありません。 Zend_Dbにはさまざまな使い方があります。特に、前述のようなテーブルゲートウェイ/行ゲートウェイメソッドがあります。 TableGatewayはクエリを実行し、行を返すことを意図しています。行は単一の行を表し、独立して操作できます。

多くの行に対してクエリを実行している場合、テーブル(または複雑な結合の場合は '仮想'テーブル)を表す別のクラスが、そのテーブルの懸念を個々の行は別々です。

関連する問題