2012-03-23 5 views
2

を使用して、関係表からより多くのデータを取得し、私はそれに非常に新しいです。 私は3つのdbテーブルを持っています。 1つはユーザー、2つ目の製品、3つ目はuser_id、product_id、製品購入時の情報などを格納する関係テーブルです。私はYiiのフレームワークを使用してWebアプリケーションを構築していますYiiの

私はMANY_MANY関係を構成し、ユーザーが購入したすべての製品を取得するには何の問題もありません。しかし、私はどのように関係テーブルから余分な情報を得ることができないのか分かりませんか?

は、あなたの会合は、追加のデータを保持している場合、あなたはクラスPurchaseとしての地位を宣言し、これらの関係を追加することができ、あなたに

+0

コードを表示してください。 – Jon

答えて

3

ありがとう:

class User extends CActiveRecord 
{ 
    public function relations() 
    { 
    return array(
     'purchases' => array(self::HAS_MANY, 'Purchase', 'user_id'), 
     // Products purchased by this user 
     'products' => array(
     self::HAS_MANY, 'Product', 'product_id', 
     'through' => 'purchases', 
    ), 
    ); 
    } 
} 

class Purchase extends CActiveRecord 
{ 
    // You need to add this, since every purchase is uniquely identified 
    // by user and product. Surrogate 'id' key is also fine 
    public function primaryKey() 
    { 
    return array('user_id', 'product_id'); 
    } 

    public function relations() 
    { 
    return array(
     'user' => array(self::BELONGS_TO, 'User', 'user_id'), 
     'product' => array(self::BELONGS_TO, 'Product', 'product_id'), 
    ); 
    } 
} 

UserProductモデルから残りMANY_MANY関係を削除します。関係はthroughの関係に注意してください。フェッチデータは次のようになります。これは、他の二つのテーブルに参加Userテーブルから一つだけのクエリを実行します

$users = User::model()->with('purchases.product')->findAll(); 
foreach ($users as $user) { 
    echo $user->username . "<br>"; 
    echo 'Purchases<br>'; 
    foreach ($user->purchases as $purchase) { 
    echo "Date: {$purchase->purchased_at}<br>"; 
    echo "Product: {$purchase->product->name} <br>"; 
    } 
    echo '<hr>'; 
} 

。また、User::model()->with('products')は、購入した製品を使用しているユーザーを効率的に見つけることができます。アソシエーションテーブルにコンポジットプライマリキーを追加する必要がある場合を除き、DBスキームは同じままです。

は、詳細な説明はthis article in the Yii wikiを参照してください。

関連する問題