对同一外部表的多个引用


Multiple Reference To Same External Table in Yii

我对Yii的开发相当陌生,我发现自己在一开始就被困住了。

在我的项目中,我有一个表,两列都指向外部表。比如:

table "item":
- user_id_1
- user_id_2
table "user":
- id

一个项目总是与两个用户相关联,但我不想区分他们,我希望能够做一些像

这样的事情
$item->users 

同时获得两个用户。反之亦然:

$user->items

获取user_id_1或user_id_2中引用用户id的所有项。

听起来对吗?任何建议吗?

Yii的ActiveRecord实际上只设置为处理一对一和一对多的关系-您似乎在描述一对二的关系。

处理这个问题的一种方法是建立一个MANY_MANY关系,但是只对两个用户使用,而不是"many"。您将需要建立一个连接Users和Items的user_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

如果你真的需要使用两个单独的user_id外键字段,就像这里一样,你需要为每个字段设置一个ActiveRecord HAS_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调用语法与这样的函数,它将返回两个用户在一个数组:

public function getUsers() {
  return array(
    $this->user1,
    $this->user2,
  );
}

这利用了Yii的__get()方法覆盖,这将允许您像调用$item->users一样调用$item->getUsers()

您可以在User模型中设置类似的东西,为user_id_1user_id_2设置两个HAS_MANY关系,以及返回合并结果数组的getItems方法。

但我认为最简单的选择是建立一个MANY_MANY关系(并将其用作ONE_TWO关系)。