2011-07-26 23 views
1

私はこれのためのベストプラクティスを知りません。 のは、私はいくつかの階層のオブジェクトがあるとしましょう:オブジェクト間の通信

Neighborhood 
Family 

したがって、各家族は近所に住んでいます。各オブジェクトモデルは、それが自身のデータベーステーブルです

class Neighborhood { 
    public $id; 
    public $name; 

    public $nr_families; 
} 

class Family { 
    public $id; 
    public $name; 
    public $neighborhood_id; 
} 

: オブジェクトは、次のようにマッピングされています。ある型のすべてのオブジェクトは、グローバルなscapeの配列に保持されているので、2つの配列があります。

Neighborhoodオブジェクトの内側から、作成日に、データベースを再度照会したり、ファミリのグローバル配列にアクセスすることなく、その近隣にいくつのファミリがあるかをどのように知ることができますか?ファミリ配列が最初に生成され、すでにそこにあるとしましょう。そして、私がNeighborhood配列を生成するとき、これらのオブジェクトはそれぞれのファミリの総数を持つプロパティを持つ必要があります。このプロパティはデータベースフィールドと一致しません。そのフィールドは即時に計算する必要があります。

デザインパターンはありますか?私はある種の第3のオブジェクトを使うべきですか?

答えて

1

追加のクエリを使用しない場合は、ファミリの近隣IDを確認するためにファミリのリストをループする必要があります。グローバル変数を使用することはお勧めできませんので、いくつかの依存関係注入を使用して、近隣について家族に伝えることができます。

あなたのNeighborhoodオブジェクトにファミリのリストを含む静的変数があるとします。あなたの対象外で、あなたはその変数を設定します。

Neighborhood::$families = $families; 

近所ことができ、そのリストの上に今のループ、家族の近所のIDチェック:

class Neighborhood { 
    function getNumberOfFamilies() { 
     $myFamilies = array(); 
     foreach(self::$families as $family) { 
      if($family->neighborhood_id === $this->id) { 
       $myFamilies[] = $family 
      } 
     } 
     $this->nr_families = count($myFamilies); 
     return $families; 
    } 
} 

だろうと仕事を?

1

オブジェクトリレーショナルマッピングの素晴らしい世界へようこそ。

オブジェクトは、それ自体についてのみ(ストアプロパティについて)「知っている」必要があります。なぜこのような何かをしない:

class Neighborhood { 
    public $id; 
    public $name; 
    private $num_families; 

    public function getNumFamilies() { 
     if (!is_int($this->num_families)) { 
      // do a database query 
      $this->num_families = $result; 
     } 
     return $this->num_families; 
    } 

}

+0

しかし、家族の数があまりにもその近所のプロパティことはできませんか?私はファミリーオブジェクトに関する情報を保存しません。 – Dan

+0

確かに、あなたはそれを怠惰にロードすることができます - 編集された答えを見てください。近隣の家族の数が、物件や接待人(ゲッター)を介してアクセスされるかどうかは、誰が気にしますか。アクセサはより柔軟です。 – alexantd