7

主キーではないフィールドに基づいてリレーションを作成する必要があります。これを行う方法の例の多くは、1 対多および多対多の関係に基づいています。以下の提案を試してみましたが成功しませんでした

主キーが「ID」でない YII のリレーション

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。したがって、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を参照してください。ドキュメントからはそれほど明白ではありませんが、この正確なことは、ローカル列をキーとして、外部列を値として、外部キー名が通常行く場所に配列を配置することで実現できます。

したがって、たとえば、モデル「Foo」のテーブルに列「col1」と「col2」を持つ複合一意キーを参照する 2 つのローカル列「fk1」と「fk2」がある場合、関係配列のエントリは次のようになります。これ:

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

CActiveRecord.relations()のドキュメントから引用:

カスタム PK->FK 関連付けを指定する必要がある場合は、それを array('fk'=>'pk') として定義できます。

于 2014-02-13T00:41:02.097 に答える