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 关系)。