我正在开发一个应用程序,该应用程序具有从外国(并且完全不可更改)来源导入的数据。我将简化一些表格来解释问题。下面是带有主键的表。
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)
因此,您可以看到 Invoices、Headers 和 Deliveries 具有一对一的关系。发票到交易和发票到消息是一对多的。
在将这些表导入我自己的数据库时,我已将现有主键更改为唯一键,并id
在每个表上添加了一个 auto_incrementing 字段 ( )。
现在的问题是在 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 一次性查询的。尝试使用一对多关系(例如,使用 Invoices 和 Transactions)的相同方法会失败,因为 Cake 会执行两个查询:第一个是查找所有匹配的 Invoices,然后第二个是查找具有相应外部的所有 Transactions与第一个查询的结果匹配的键:(这是它尝试运行的简化查询)
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`
你可以看到,它没有加入发票,所以查询死了。
关于如何完成这项工作的任何想法?