私は、外部の(そして完全に変更できない)ソースからインポートされたデータを持つアプリケーションに取り組んでいます。問題を説明するために、いくつかの表を簡略化します。以下は、主キーのある表です。
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の関係があることがわかります。請求書からトランザクションおよび請求書からメッセージは1対多です。
id
これらのテーブルを自分のデータベースにインポートする際に、既存の主キーを一意のキーに変更し、各テーブルにauto_incrementingフィールド()を追加しました。
ここで問題となるのは、Cakeでリレーションシップを設定することです。これは、Cakeが実際には複合キーをまったく処理しないためです。私は1対1の関係を次のように機能させることができました:
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"
)
)
)
;
}
そして、これは機能します。これは、1対1の関係が、大きなLEFTJOINを使用して一度に照会されるためです。Cakeは2つのクエリを実行するため、1対多の関係(たとえば、請求書とトランザクション)で同じ方法を試行すると、1つ目は一致するすべての請求書を検索し、2つ目は対応する外部のすべてのトランザクションを検索するために終了します。最初のクエリの結果と一致するキー:(実行しようとしている簡略化されたクエリは次のとおりです)
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`
ご覧のとおり、請求書に結合されていないため、クエリは終了します。
これを機能させる方法について何かアイデアはありますか?