ここのYiiドキュメントによると:
http://www.yiiframework.com/doc/api/1.1/CActiveRecord#relations-detail
代わりに self::HAS_ONE を使用することをお勧めします (ただし、LinkedIndex に同じ ID を持つ複数の行が存在する可能性がある場合を除きます。ただし、上記の外観からは、そうであるとは思えません)。
スキーマに従って、異なるキーを持つテーブルをリンクできます。
外部キー => 主キー
カスタム PK->FK 関連付けを指定する必要がある場合は、それを array('fk'=>'pk') として定義できます。複合キーの場合は、array('fk_c1'=>'pk_с1','fk_c2'=>'pk_c2') になります。
だからあなたの場合:
public function relations(){
return array(
'linkedIndex' => array(self::HAS_ONE, 'LinkedIndex', array('ID' => 'linkedIndex')),
);
}
ここLinkedIndex
で、Linkeddex モデルのクラス名 (テーブル モデルに相対的 - つまり、同じフォルダー。もちろん変更できます) でありarray('ID' => 'linkedIndex')
、関係を として指定しますLinkedIndex.ID = Table.linkedIndex
。
編集
更新された例を見ると、関係関数の仕組みを誤解していると思います。エラーが発生しています
include(linkedIndex.TableName.php) [function.include]: ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません
ここで別のリレーションを作成しようとしているためです。
'linked' => array(
self::BELONGS_TO,
'linkedIndex.TableName',
array('ID' => 'linkedID'),
)
この部分:linkedIndex.TableName
新しいモデル クラスを参照するlinkedIndex.TableName
ため、Yii はそのクラスのファイルをロードしようとしますがlinkedIndex.TableName.php
、存在しないためエラーをスローします。
あなたが探しているのはTableName
、テーブル内の値にアクセスできることだと思いますよねLinkedIndex
?Table
その場合、次の方法でモデル内からアクセスできます。
$this->linkedIndex->TableName
これは、上で設定した関係によって可能になります。 モデルを$this
参照し、上で作成した関係を参照し、そのモデルの属性です。Table
linkedIndex
LinkedIndex
TableName
LinkedIndex
編集 2
あなたのコメントによると、あなたはより複雑な関係を作ろうとしているようです。正直なところ、これは実際にはリンク テーブルを使用する方法ではありません (理想的には、どの 3 番目のテーブルにリンクするかを示すリンク テーブルではなく、2 つのテーブル間にリンク テーブルが必要です)。 Yii 内でできる限りあなたの質問に答えてください。
理想的には、この関係はLinkedIndex
モデル内から作成する必要があります。モデル内に関係があるからです。
テーブル名をリンク要素として使用しているため、レコードが見つかった後に使用するテーブルを動的に渡す方法を作成する必要があります。
Yii 内でモデルが作成された後、LinkedIndex
モデルの afterFind 関数を使用して 2 次リンクを作成し、そこで新しいリンクされたモデルをインスタンス化することができます。
LinkedIndex モデルは次のようになります。
class LinkedIndex extends CActiveRecord{
public $linked;
public static function model($className = __CLASS__){
return parent::model($className);
}
public function tableName(){
return 'LinkedIndex';
}
public function afterFind(){
$this->linked = new Linked($this->TableName);
parent::afterFind();
}
//...etc.
}
はafterFind
新しいLinked
モデルをインスタンス化し、使用するテーブル名を渡します。Linked
これにより、モデル内から次のようなことができます。
class Linked extends CActiveRecord{
private $table_name;
public function __construct($table_name){
$this->table_name = $table_name;
}
public static function model($className = __CLASS__){
return parent::model($className);
}
public function tableName(){
return $this->table_name;
}
//...etc.
}
これが、交換可能なテーブル名を持つクラスを動的に作成する方法です。もちろん、これはクラスがメソッドごとに個別の操作を実行する必要があるため失敗しますが、それが何であるかを確認し、table_name
それに応じて行動することができます (これはかなり厄介ですが、うまくいきます)。
これはすべて、(モデルlinked
内から)次の方法でテーブルのプロパティにアクセスすることになります。Table
$this->linkedIndex->linked->foo;