0

私はYiiの開発にまったく慣れておらず、最初から立ち往生しています。

私のプロジェクトには、両方とも外部テーブルを指す2つの列を持つテーブルがあります。何かのようなもの:

table "item":
- user_id_1
- user_id_2

table "user":
- id

ですから、私はいつも2人のユーザーに関連付けているアイテムですが、それらを区別したくないので、次のようなことができるようにしたいと思います。

$item->users 

両方のユーザーを取得します。そしてまたその反対:

$user->items

user_id_1またはuser_id_2のユーザーIDを参照するすべてのアイテムを取得します。

これは正しいですか?なにか提案を?

4

1 に答える 1

3

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_2getItemsマージされた結果配列を返すメソッドを使用して、Userモデルで同様の設定を行うことができます。

しかし、最も簡単なオプションは、MANY_MANY関係を設定すること(そしてそれをONE_TWO関係を使用すること)だと思います。

于 2013-03-25T03:48:57.907 に答える