gpt4 book ai didi

php - 使用 CakePHP 中没有单个外键的模型

转载 作者:行者123 更新时间:2023-11-29 15:07:41 25 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序具有从外部(并且完全不可更改)源导入的数据。我将简化一些表格来解释问题。下面是带有主键的表。

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)

因此您可以看到发票、标题和交货具有一对一的关系。发票到交易和发票到消息是一对多的。

在将这些表导入到我自己的数据库中时,我将现有主键更改为唯一键,并在每个表上添加了一个自动递增字段 (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`

您可以看到,它没有加入发票,因此查询终止。

关于如何实现这项工作有什么想法吗?

最佳答案

最坏的情况,您可以使用 hasMany relationship 的 finderQuery 参数。它允许您完全覆盖查询。

您或许还可以添加一个唯一的 ID 字段,将相关数据字段合并为一个。 UPDATE 语句可以修复现有数据,并且可以设置 TRIGGER 来在添加或更改新记录时更新它们(假设您的数据库支持触发器)。

编辑:考虑到所有其他复杂性,您最好完全跳过 hasMany 关系并在单独的 find() 中获取事务记录。如果您必须在很多地方执行此操作,您始终可以将其包装在发票模型中的一个函数中,如下所示:

<?php
class Invoice extends AppModel() {
...

function getInvoice($conditions) {
$invoice = $this->find('first', compact('conditions'));

$conditions = array(
'Transaction.doc_number' => $invoice['Invoice']['doc_number'],
'Transaction.date_printed' => $invoice['Invoice']['date_printed'],
'Transaction.batch_number' => $invoice['Invoice']['batch_number']);
$invoice['transactions'] = $this->Transaction->find('all', compact('conditions'));

return $invoice;
}
}
?>

如果您在模型中使用类似的函数,请不要忘记 Invoice 需要定义与 Transaction 的关系,即使您不直接使用它,以便定义 $this->Transaction 。

此外,如果您希望以 hasMany 关系的方式返回数据,您可以随时添加一个 foreach 循环来以这种方式重新组合它们。

更新还有一个SimpleResults behavior in the Cake Bakery这将允许轻松地以常规 hasMany 关联的格式从其他表返回这些结果。

关于php - 使用 CakePHP 中没有单个外键的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1648303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com