2008-04-10

こんな model はこうする(ことができるかも?)

こんな model はどうする? の続きです。

Oyatbl - hasMany - Kotbl - belongsTo - Betsutbl

のような関係の kotbls_xxx が 200 個近くあります。
アクセスする kotbls_xxx は、oyatbls のフィールドの値で決まります。kotbls_xxx は、別の masters テーブルの id に対応(xxx = id)した個数あります。

$this->Oyatbl->Kotbl->setSource('kotbls_' . $id);

で、すんなり動きました。ただし、Kotbl モデルの定義で、あとで setSource するからといって Kotbl->useTable = false としてしまうと belongsTo Betsutbl アソシエーションが効きません。setSource では、アソシエーションの再構築が行われないようです。
Kotbl->useTable = 'kotbls_xxxどれか' と定義しておくか、setSource のあとで bindModel/unbindModel する必要がありました。

また、上の記述とアソシエーション定義を見て気付いたのですが

var $hasMany = array(
'assocalias' = array(
'className' => 'Kotbl',
...

この場合は、className Kotbl モデルのインスタンス(オブジェクトだっけ?)が assocalias という名前で生成されるということらしいです。
なので、こんな荒業も

$ids = $this->Master->find('list', array('id'));
foreach ($ids as $id) {
$assocKey = 'Kotbl' . $id;
$tblName = 'kotbls_' . $id;
$this->Oyatbl->bindModel(array(
'hasMany' => array(
$assocKey => array(
'className' => 'Kotbl',
'foreignKey' => 'fkey',
'dependent' => false
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
)
, false
)
);
$this->Oyatbl->{$assocKey}->setSource($tblName);
}

デバッガで覗いた限りでは、model オブジェクトの中身はそれらしくなっていました。動作の確認は、また明日。しかし、かなりヘビー。大量の SQL 発行とかなりメモリも消費します。実用になるのか?

delete をトランザクションで行いたいのですが、なんか、苦労の方向性が間違っている気がする。DB 設計を見直してリレーションを設定して delete cascade で良いんじゃないか? ただ、既存 DB なので影響範囲にすべて手を入れるとなると...

0 件のコメント: