7

我需要基于不是主键的字段创建关系。许多如何做到这一点的例子都是基于一对多和多对多的关系。我尝试了以下建议但没有成功

YII 中非“ID”作为主键的关系

Yii CActiveRecord:查找相关数据,但不使用主键

Yii 与非主键的关系

Yii 模型关系连接 (HAS_ONE)

我有以下表结构:

+------+---------+-----------+
| id   |   name  | status_id |
+------+---------+-----------+
|  1   | service1| 1         |
+------+---------+-----------+
| 2    | service2| 2         |
+------+---------+-----------+

这是我的表 active_service。我也有下表

+----------+----------+---------------------+-----------+
|id        |related_id|related_text         |  text     |
+----------+----------+---------------------+-----------+
|65        |1         |ActiveServices_status|  Open     |
+----------+----------+---------------------+-----------+
|72        |2         |ActiveServices_status|  Active   |
+----------+----------+---------------------+-----------+
|102       |3         |ActiveServices_status|  Closed   |
+----------+----------+---------------------+-----------+

这是我的related_fields 表 该表包含用于下拉列表等的所有字段。它related_text告诉我们它的用途以及related_id状态的ID,这是我需要链接到的字段。所以status_idactive_service表中的 与related_id满足条件的related_fields表的字段相关,即related_text设置为ActiveServices_status。我将如何创建这种关系。这是迄今为止我所做的最好的例子(在 ActiveServices 模型中)。

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(

        'rl_status'=>array(self::BELONGS_TO,'RelatedFields','status_id','condition'=>'related_text = "ActiveServices_status"','on'=>'status_id = related_id'),
    );
}

任何帮助,将不胜感激。

4

3 回答 3

15

所以在尝试了大约 100 行不同的代码后,终于想通了。所以这是对我有用的解决方案。

'rl_status' => array(self::BELONGS_TO, 'RelatedFields', '', 'foreignKey' => array('status_id'=>'related_id'),'condition'=>'related_text = "ActiveServices_status"',
于 2013-10-30T11:56:06.510 回答
2

作为记录,在 Yii 1.1.9 中已经解决了这个问题;见问题#2706。从文档中看并不是很明显,但是这个确切的事情可以通过将一个数组放在外键名称通常去的地方来完成,本地列作为键,外列作为值。

因此,例如,如果您有两个本地列 'fk1' 和 'fk2' 引用了一个复合唯一键,其中模型“Foo”的表中的列 'col1' 和 'col2' ,您在关系数组中的条目看起来像这个:

'foo' => array(self::BELONGS_TO, 'Foo', array('fk1'=>'col1','fk2'=>'col2'))

引用自CActiveRecord.relations()的文档:

如果您需要指定自定义 PK->FK 关联,您可以将其定义为 array('fk'=>'pk')。

于 2014-02-13T00:41:02.097 回答
1
'rl_status' => array(self::BELONGS_TO, 'RelatedFields', '', 'foreignKey' => array('status_id'=>'related_id'),'condition'=>'related_text = "ActiveServices_status"'
于 2014-09-10T05:02:45.920 回答