YiiのActiveRecordは、実際には1対1および1対多の関係を処理するように設定されているだけです。1対2の関係を説明しているようです。
これを処理する1つの方法は、 MANY_MANY関係を設定することですが、「many」ではなく2人のユーザーで使用するだけです。user_item
キーをテーブルに直接埋め込むのではなく、ユーザーをアイテムに接続するテーブルを設定する必要があります。2つのUsers-to-an-Itemのみを適用する必要がある場合は、Itemモデルに追加の検証コードを記述する必要があります。Itemの関係は次のようになり、$item->users
好きなように呼び出すことができます。
public function relations() {
return CMap::mergeArray(parent::relations(),array(
'users'=>array(self::MANY_MANY, 'User', 'user_item(item_id,user_id)'),
));
}
新しい連想テーブルは次のようになります。
user_item:
-- user_id
-- item_id
ここにあるような2つの別々のuser_id外部キーフィールドを本当に使用する必要がある場合は、次のように、それぞれにActiveRecordHAS_ONEリレーションを設定する必要があります。
public function relations() {
return CMap::mergeArray(parent::relations(),array(
'user1' => array(self::BELONGS_TO, 'User', 'user_id_1'),
'user2' => array(self::BELONGS_TO, 'User', 'user_id_2'),
));
}
ただし、次のような関数を使用して呼び出し構文を有効にすることはできます。$item->users
これにより、両方のユーザーが1つの配列で返されます。
public function getUsers() {
return array(
$this->user1,
$this->user2,
);
}
これはYiiの__get()
メソッドオーバーライドを利用しており、の$item->getUsers()
ように呼び出すことができます$item->users
。
user_id_1
との2つのHAS_MANY関係とuser_id_2
、getItems
マージされた結果配列を返すメソッドを使用して、Userモデルで同様の設定を行うことができます。
しかし、最も簡単なオプションは、MANY_MANY関係を設定すること(そしてそれをONE_TWO関係を使用すること)だと思います。