我正在處理從外部(並且完全不可更改)源導入數據的應用程序。我會簡化一些表格來解釋問題。下面是帶有主鍵的表格。使用CakePHP中沒有單個外鍵的模型
invoices (doc_number, date_printed, batch_number)
headers (doc_number, date_printed, batch_number)
deliveries (doc_number, date_printed, batch_number)
transactions (doc_number, date_printed, batch_number, line_number)
messages (doc_number, date_printed, batch_number, line_number)
所以你可以看到,發票,頁眉和交付有一對1的關係。發票到交易和發票到消息是一對多的。
在將這些表導入到我自己的數據庫中時,我已將現有主鍵更改爲唯一鍵,並在每個表上添加了auto_incrementing字段(id
)。
現在問題是在Cake中設置關係,因爲它根本不處理組合鍵。我已經能夠得到這樣工作一到一對一的關係:
class Invoice extends AppModel {
public $name = "Invoice"
, $hasOne = array(
"Header" => array(
'foreignKey' => false,
'conditions' => array(
"Invoice.doc_number = Header.doc_number",
"Invoice.date_printed = Header.date_printed",
"Invoice.batch_number = Header.batch_number"
)
)
)
;
}
而且這工作,因爲一到一個關係在一個去質疑一個大LEFT JOIN。嘗試使用與一對多關係相同的方法(例如,使用發票和交易)將會死亡,因爲Cake會執行兩個查詢:第一個查找所有匹配的發票,然後第二個查找具有相應外部的所有交易從第一次查詢的結果一致的關鍵:(這裏是它試圖運行簡化查詢)
SELECT `Transaction`.* FROM `transactions` AS `Transaction`
WHERE `Invoice`.`doc_number` = `Transaction`.`doc_number`
AND `Invoice`.`date_printed` = `Transaction`.`date_printed`
AND `Invoice`.`batch_number` = `Transaction`.`batch_number`
你可以看到,它不加入到這樣的發票查詢死亡。
有關我如何完成這項工作的任何想法?
所以我告訴蛋糕,這是一個HABTM當它是真的「的hasMany」?關於這些數據真的非常棒的新聞(對我來說)是它在應用程序中是隻讀的,所以更新和觸發器不會成爲問題。 – nickf 2009-10-30 10:02:30
不,這應該是hasMany,只是finderQuery。我第一次通過它誤讀了一些東西。 – Jason 2009-10-30 11:04:57