2009-06-24 22 views
3

3テーブルからすべてのデータを取得したいZend多対多関係

ユーザー、プロパティ、およびユーザーのプロパティ。

私はmanytomanyRowsetを使用することに決めました。しかし、私の驚いたことに、私は、プロパティとusers_propertiesテーブルからデータを取得しますが、usersテーブルのデータは取得しません。何故ですか?私はusersテーブルからいくつかのカラムが必要ですmanytomanyrowset関数にも私は現在のテーブルからのデータが必要であることを伝える方法はありますか?

これは、私はZend Frameworkの中にテーブル関係の機能を設計し、コード化されたadavance

答えて

6

public function fetchRegisteredProperties() 
{ 

    $userTable = $this->getTable(); 
    require_once APPLICATION_PATH . '/models/DbTable/UsersPropertiesDB.php'; 
    require_once APPLICATION_PATH . '/models/DbTable/PropertiesDB.php'; 

    $propertiesRowset = $table->fetchAll(); 
    $allProperties = array(); 

    foreach ($propertiesRowset as $row) { 
     $propertiesRowset = $row->findManyToManyRowset(
      'Model_DbTable_Properties','Model_DbTable_UsersProperties'); 
     $allProperties = array_merge($tempArray,$propertiesRowset->toArray()); 
    } 

    return $allProperties; 
} 

おかげで私の関数です。

あなたの質問に対する答えはいいえです。findManyToManyRowset()メソッドは、関連するテーブルから行をフェッチするのみで、対応するRowオブジェクトにマージしません。その理由は、ZFのRowオブジェクトがsave()自身をデータベースに戻すことができ、フィールドを追加した場合、そのオブジェクトとの関係を知ることができないためです。

したがって、ユーザーフィールドとユーザープロパティのコレクションの両方を保持するカスタムRowオブジェクトを実装する必要があります。ユーザープロパティをRowsetオブジェクトとして格納します。

__get()__set()を拡張して、オブジェクトのプロパティを読み書きするときにフィールドを正しい配列にマップする方法を知っているようにします。つまり、ユーザー行の一部ではないフィールドを読み書きしようとすると、ユーザープロパティの行セットに戻ります。

また、現在の行だけでなく、ユーザープロパティの行セットにsave()も保存するようにsave()を拡張します。

+0

あなたに誇り! – xenon

+0

ああ、大丈夫です。私はフレームワークをzendするのが初めてで、cakePhpが処理する方法に慣れていました。早速の対応、ありがとうございました! –