我正在其具有从外(和全不可改变)源导入的数据的应用程序。我会简化一些表格来说明这个问题。下面是与他们的主键的表。

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的关系。发票到交易和发票到消息是1对多。

在导入这些表到我自己的数据库,我已经改变了现有的主键是一个唯一的密钥和在每个表加入auto_incrementing字段(id)。

现在的问题是建立在蛋糕的关系,因为它并没有真正在所有处理组合键。我已经能够得到这样工作一到一对一的关系:

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。尝试同样的方法用一个一对多的关系(例如,有发票和交易)死了,因为蛋糕做两个查询:首先找到所有匹配的发票,然后将第二个找到的所有交易与相应的外国从第一查询的结果匹配项:(这里是它试图运行简化查询)

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关系的finderQuery参数。它可以让你完全覆盖查询。

您可能还可以添加,结合了相关数据域成一个独特的ID字段。 UPDATE语句能解决现有数据和触发器可以被设置为更新新的记录,因为它们增加或改变,假设你的数据库支持触发器。

编辑:与其他所有的复杂性,你可能会更好干脆跳过的hasMany关系,并在一个单独的发现取的交易记录()。如果你必须这样做非常多的地方,你总是可以把它包在一个函数中像这样的发票型号:

<?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;
    }
}
?>

如果您在模型中使用的函数那样,不要忘记,发票需要交易定义的关系,即使你不直接使用它,让这个 - $>交易的定义。

此外,如果你喜欢的数据返回的方式的hasMany关系会是这样,你可以随时添加foreach循环重组他们的方式。

<强>更新 还有在蛋糕面包店 SimpleResults行为将允许容易地返回从另一表那些结果在常规的hasMany关联的格式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top