我需要根据不是主键的字段创建关系。许多如何执行此操作的示例基于一对多和多对多关系。我已经尝试了以下建议但没有成功
Relation in YII with not "ID" as primary key
Yii CActiveRecord: find related data, but not using the primary key
Yii Relations with non-Primary keys
Yii Model Relation Join (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,这是我需要链接到的字段。因此,active_service表中的status_id
与满足条件的related_fields表的related_id
字段相关,即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'),
);
}
任何帮助将不胜感激。
答案 0 :(得分:13)
因此,在尝试了大约100行不同的代码后,终于想出了这个问题。所以这是对我有用的解决方案。
'rl_status' => array(self::BELONGS_TO, 'RelatedFields', '', 'foreignKey' => array('status_id'=>'related_id'),'condition'=>'related_text = "ActiveServices_status"',
答案 1 :(得分:2)
为了记录,在Yii 1.1.9中已经解决了这个问题;请参阅问题#2706。从文档中可以看出这一点并不十分明显,但是通过将数组放在外键名称通常所在的位置,将本地列作为键,将外部列作为值,可以实现这一点。
因此,例如,如果你有两个本地列'fk1'和'fk2'引用一个复合唯一键,其中列'col1'和'col2'在模型“Foo”的表中,你在关系数组中的条目看起来像这样:
'foo' => array(self::BELONGS_TO, 'Foo', array('fk1'=>'col1','fk2'=>'col2'))
引用CActiveRecord.relations()上的文档:
如果您需要指定自定义PK-> FK关联,您可以将其定义为数组('fk'=>'pk')。
答案 2 :(得分:1)
'rl_status' => array(self::BELONGS_TO, 'RelatedFields', '', 'foreignKey' => array('status_id'=>'related_id'),'condition'=>'related_text = "ActiveServices_status"'