0

我对 Yii 开发很陌生,我发现自己一开始就陷入了困境。

在我的项目中,我有一个表,其中两列都指向一个外部表。就像是:

table "item":
- user_id_1
- user_id_2

table "user":
- id

所以一个项目我总是与两个用户相关联,但我不想区分它们,我希望能够做类似的事情

$item->users 

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

$user->items

获取在 user_id_1 或 user_id_2 中引用用户 ID 的所有项目。

这听起来对吗?有什么建议吗?

4

1 回答 1

3

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

处理此问题的一种方法是建立一个MANY_MANY 关系,但只需将它用于两个用户而不是“许多”。您将需要设置一个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->getUsers()like $item->users

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

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

于 2013-03-25T03:48:57.907 回答